Пример Hibernate HQL - PullRequest
       4

Пример Hibernate HQL

0 голосов
/ 24 августа 2018

Вчера, просматривая некоторые репозитории на Github, я обнаружил некоторые интересные вещи: один Java-проект (я не буду упоминать название репозитория, но я уже уведомил его владельца) содержал плохую обработку HQL-запросов, которая моглапривести к инъекциям SQL / HQL.Код был следующим: (обратите внимание, что username и password исходят от пользователя)

  Query query = session.createQuery("from Client where username = '" + username + "'");
  List clients = query.list();
  Client client = (Client) clients.get(0);
  if (!validPassword(client.getPassword(), password)) {
      return false;
  }
  //client is authenticated....

Я думаю, очевидно, что этот запрос является инъекционным.Я действительно не знаю, как можно использовать этот уязвимый запрос, потому что даже если мы введем username, password все еще проверяется.Использовалась база данных MySql (если это помогает).
Поэтому мой вопрос: как это можно использовать?

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Несмотря на то, что HQL является более строгим, чем SQL для инъекций, он все еще может быть использован.

Некоторые примеры инъекций объяснены на https://blog.h3xstream.com/2014/02/hql-for-pentesters.html

Подобный вопрос был задан уже ранее на https://security.stackexchange.com/questions/24265/hql-injection-example

Ответ на этот вопрос объясняет, как можно сканировать символы пароля (хеш). например если для базы данных Oracle значение username равно:

admin' AND SUBSTR(password, 0, 1) = 'A

Тогда, если

  1. первый символ пароля (хеш) не 'A' -> Список клиентов пуст, а вызов метода clients.get(0) выдает IndexOutOfBoundsException
  2. первый символ пароля (хеш) - «A», но предоставленный пароль неверен -> пользователь не аутентифицирован
  3. первый символ пароля (хеш) - «A», и предоставленный пароль правильный -> пользователь аутентифицирован

Хакер может повторить запрос для каждого x и z в

SUBSTR(password, x, x + 1) = z

в приведенном выше запросе до тех пор, пока результатом всегда не будет 2. случай, когда пользователь не аутентифицирован. Таким образом, он может узнать хеш пароля для пользователя admin и, возможно, сможет взломать его пароль.

Возможны и другие эксплойты, я не буду перечислять их все ...

0 голосов
/ 24 августа 2018

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

Например,

username = "ABC"

1) Ваш запрос от клиента, где username = 'ABC' будет получать данныеот Клиента, чье имя пользователя является точной ABC.Если он нашел несколько одинаковых имен пользователей, он также возвращает все.

2) Будет храниться в списке.0 или более записей будут храниться в списке.

3) Затем, независимо от того, какие записи поступили, они извлекают только первую запись, используя

Client client = (Client) clients.get (0);

4) он проверяет пароль записи объекта клиента с вашим ожидаемым паролем, который можно предположить сохранить в некоторой переменной с помощью вызова метода.

5) если он не будет совпадать, он вернется с ложным логическим флагомв противном случае код продолжит выполнение аутентифицированного клиента.

Надеюсь, вы получили ответ.

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