SQL-инъекция в Java и MySQL при использовании нескольких запросов - PullRequest
2 голосов
/ 12 июля 2009

У меня есть веб-приложение с SQL-инъекцией как часть оператора INSERT. Это выглядит так:

INSERT INTO table1 VALUES ('str1', 1, 'INJECTION HERE')

Я могу вставить обычные инъекции по нескольким запросам, например ');truncate table1;--, но из-за того, что используется Java + MySQL, он не позволяет составлять несколько запросов, поэтому приведенная выше инъекция приведет к ошибке из MySQL и второго запроса никогда не исполняется.

Таким образом, в принципе кажется, что все, чего можно добиться от такого внедрения в вышеупомянутой архитектуре, - это внедрение «ненужных данных», что также возможно без внедрения.

Существуют и другие методы, такие как использование load_file(), но это все равно не позволит мне манипулировать базой данных в той степени, в которой я ищу.

Я что-то здесь упускаю? Есть ли другой способ использовать эту инъекцию для получения контроля над базой данных?

Ответы [ 3 ]

2 голосов
/ 12 июля 2009

Конечно, если вы измените комбинацию базы данных / драйвера с текущей реализации на что-то, поддерживающее несколько запросов, то вы активируете скрытую дыру в безопасности, о которой (без сомнения) люди забудут!

Игнорирование злонамеренных, вредоносных сценариев, приведенное выше вызовет проблемы с вставкой обычных данных, включая символы кавычек и т. Д., То есть приведенное выше просто не будет работать для определенных наборов данных (если не очищено / не удалено так далее.). Я бы исправил это просто для функциональности.

Вы должны взглянуть на PreparedStatement и методы вставки данных для этого ( setString () ) и т. Д.

например:.

   PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES
                                     SET SALARY = ? WHERE ID = ?");
   pstmt.setBigDecimal(1, 153833.00)
   pstmt.setString(2, "Insert what you like here")

Метод setString () будет поддерживать любую строку без проблем с экранированием / внедрением.

1 голос
/ 12 июля 2009

SQL-инъекция не должна удалять что-либо из базы данных. Злоумышленник может захотеть получить некоторые ценные данные, к которым у него нет доступа.

Например, рассмотрим следующую форму после внедрения (я не знаком с синтаксисом MySQL, но что-то вроде этого должно быть вообще возможно - добавьте приведение по необходимости):

INSERT INTO table1 VALUES ('str1', 1,
-- injected stuff --
'' || (SELECT valuable_info FROM admin_only_table WHERE id=1) || ''
-- end injected stuff --
))

Теперь table1 - где, например, может быть получена некоторая общедоступная информация, так что любой может видеть значения - содержит потенциально чувствительное значение из предположительно защищенной таблицы admin_only_table.

Конечно, это предполагает, что ваш сервер не выполняет никаких трюков, таких как олицетворение пользователя, или иным образом ограничивает разрешения на уровне SQL для запросов, а выполняет их все с полными привилегиями.

0 голосов
/ 08 ноября 2016

Как объяснено в этом посте , с вашим приложением может случиться больше неприятностей, чем с классическим столом DROP:

  • вызовите спящую функцию, чтобы все ваши подключения к базе данных были заняты, что делает ваше приложение недоступным
  • извлечение конфиденциальных данных из БД
  • в обход аутентификации пользователя

В итоге, вы никогда не должны использовать конкатенацию строк при построении операторов SQL. Для этого используйте выделенный API.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...