Как выполнить SQL-инъекцию для целей тестирования? - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть веб-приложение, которое я пытаюсь «сломать». Существует страница входа, требующая ввода имени пользователя и пароля.Допустим, у меня есть таблица Auser, в которой хранится информация об имени пользователя в MySQL.

Когда я нажимаю «Войти» после ввода учетных данных, он выполняет следующую строку кода:

String sql = "select object(o) from Auser as o where ausername='" + username + "'";

Теперь язнаю, что не использование preparedStatement делает запрос SQL уязвимым для внедрения SQL, и я хочу выполнить такой трюк.Я создал фиктивную таблицу с именем test с целью удаления этой таблицы с помощью команды впрыска.

Я пробовал различные способы, например, при вводе имени пользователя (root - это имя пользователя):

root` DROP TABLE test;

И это не сработало.Есть ли способ сделать мою инъекцию успешной?

Обновление :

Просто дополнительная информация, мой столбец имени пользователя VARCHAR(255), и мой метод получения имени пользователя ниже:

public Auser get(String username, boolean moreInfo) {
 try {
  Auser u = null;
  String sql = "select object(o) from Auser as o where ausername='" + username + "'";
  List resList = em.createQuery(sql).getResultList();
  if (resList == null) { // null check for sql query / library error
   msg = CoreUtil.wrapMsg(CoreUtil.FUNC_ERROR,
    this.getClass().getName(), "get[" + username + "]", "query error AUSER.");
  } else if (resList.isEmpty()) {
   msg = "User " + username + " not found.";
  } else {
   u = (Auser) resList.get(0);
  }
  return u;
 } catch (Exception e) {
  msg = CoreUtil.wrapMsg(CoreUtil.FUNC_ERROR,
   this.getClass().getName(), "get[" + username + "]", e.getMessage());
  return null;
 }
}

Кажется, что каждое решение, которое я пробовал, продолжает выдавать IllegalArgumetnException, и таблица все еще остается. Я просто хочу использовать уязвимости моей программы, это может быть любой вид инъекций, будь то удаление таблицы,возвращение всей информации о пользователях и т. д.

Ответы [ 2 ]

1 голос
/ 09 апреля 2019

EntityManager имеет встроенную (очень) базовую защиту, которая не может выполнять более одной команды в одном и том же операторе SQL.

Это защитит вас от Robert'); DROP TABLE Students; --, но не защитит от злоумышленников, пытающихся расширить / изменить один выполняемый запрос.

Например, в вашем коде злоумышленник может получить информацию о другом пользователе, введя имя пользователя ' OR 1 = 1 --; Это приведет к выполнению строки SQL

select object(o) from Auser as o where ausername='' OR 1 = 1 --'

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

Злоумышленник также может узнать структуру таблицы таким образом - он может попробовать строки типа ' and IS_ADMIN = IS_ADMIN -- или ' OR ID = 0 --. Если они попробуют достаточно их (и атаки, подобные этой, могут быть легко автоматизированы), они найдут правильные имена столбцов, когда запрос не выдаст ошибку. Затем они могут сделать более целенаправленную инъекционную атаку, чтобы получить доступ к учетной записи администратора.

Они могут также узнать что-то из сообщения об ошибке, возвращенного при неудачной попытке, такой как платформа БД, что может упростить атаки.

0 голосов
/ 08 апреля 2019
String sql = "select object(o) from Auser as o where ausername='" + username + "'";

Если вы хотите удалить тестовую таблицу

username = "x'; DROP TABLE test AND '1'='1"

Если вы хотите увидеть все поля всех записей ausers

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