2009-07-12 3 views
2

У меня есть веб-приложение с SQL-инъекцией как часть инструкции INSERT. Это выглядит следующим образом:SQL Injection в Java и MySQL при использовании нескольких запросов

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

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

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

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

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

ответ

2

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

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

Вы должны взглянуть на 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

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

Как объяснена в this post, есть более плохие вещи, которые могут произойти с приложением, чем классический стол DROP:

  • вызова функцией сна, так что все ваши соединения с базой данных будут заняты, поэтому сделать заявку недоступен
  • извлечение конфиденциальных данных из БД
  • bypassing the user authentication

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

 Смежные вопросы

  • Нет связанных вопросов^_^