Получение имени БД в SQLInjection - PullRequest
0 голосов
/ 25 ноября 2018

Я изучаю SQLInjection на некоторых обучающих веб-страницах (поэтому я не знаю, что такое бэкэнд).Я пробую следующую инъекцию, чтобы получить тип de DB.

(1) http://url/?departamento=1 union select user()

Таким образом, если DB является MySQL, я должен получить некоторые результаты.Однако я не вижу никаких результатов.Если я изменяю инъекцию на это новое предложение, данные возвращаются правильно, поэтому БД - MySQL (даже я вижу имя БД с этой новой инъекцией):

(2) http://url/?departamento=1 union select 1,user()

Тем не менее, если я изменюсь сноваВнедрение в один из этих результатов приводит к изменению.

(3) http://url/?departamento=1 union select 1,2,user() (I don't see any data)
(4) http://url/?departamento=1 union select user(),2 (Here I don't see the DB name)

Я не понимаю, почему я должен добавить (во втором операторе выбора) больше столбцов, чтобы увидеть данные.Почему это происходит?

Спасибо!

1 Ответ

0 голосов
/ 25 ноября 2018

Предположим, что бэкэнд является Java, код выполняет что-то похожее на это:

// 1 union select 1,user()
String query = "select a, b, c from someTable where departamento = " 
             + request.getParameter("departamento"); // the injection is here
try (Statement stmt = con.createStatement()) {
  try (Result rs = stmt.executeQuery()) {
    while (rs.next()) {
      int a = rs.getInt(1); // column "a"
      String b = rs.getString(2); // column "b"
      Date c = rs.getDate(3); // column "c"
      System.out.println("a: " + a + ", b: " + b + ", " c: " + c);
    }
  }
}

Чтобы инъекция работала, вам нужно сгенерировать допустимый оператор SQL.

  • Ваш союз должен иметь такое же количество столбцов, что и исходный запрос
  • Тип вашего столбца должен совпадать;тип столбцов в первом подзапросе должен быть таким же, как и во втором подзапросе (из-за этого может произойти сбой запроса в некоторой базе данных).
  • Ваши критерии ("1") должны соответствовать правой части фильтра (departemento)
  • Возможно, специфично для Java (и этого примера), чтобы цикл работал, вы должны иметь возможность привести столбец к его целевому типу.Если столбец 1 является числом, то, скорее всего, вы никогда не сможете отобразить его содержимое, если ваш союз создаст строку, не конвертируемую в число.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...