Пример внедрения Hibernate HQL

Вчера, просматривая некоторые репозитории на 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 (если это помогает) .
Итак, мой вопрос: как это можно использовать?

ммм ... какой у тебя вопрос? Возможный способ его использования?

Federico klez Culloca 24.08.2018 14:33

да, обновил описание.

Csa77 24.08.2018 14:35

Строка username = "имя или 1 = 1";

brijesh 24.08.2018 14:37

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

Csa77 24.08.2018 14:39

если драйвер позволяет, вы можете добавить обновление, которое изменяет пароль на все, что вам нужно. Это вообще разрешено?

Federico klez Culloca 24.08.2018 14:44

столы для бобби ...

toongeorges 24.08.2018 14:48
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
6
2 315
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Например,

username = "ABC"

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

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

3) Какие бы записи ни приходили, он извлекает только первую запись, используя

Клиент client = (Клиент) clients.get (0);

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

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

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

Я думаю, что вопрос скорее в том, "учитывая этот код, как я могу его использовать?" вместо "как мне это исправить?"

Federico klez Culloca 24.08.2018 15:04

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

bangoria anjali 24.08.2018 15:08

Опять же, похоже, вы отвечаете на совершенно другой вопрос.

Federico klez Culloca 24.08.2018 15:17

Это является описательное, вы правы. Просто вы отвечаете на другой вопрос.

Federico klez Culloca 24.08.2018 15:33
Ответ принят как подходящий

Несмотря на то, что 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 и, возможно, сможет взломать его пароль.

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

"всякие гадости", на мой взгляд, не отвечают на этот вопрос. Вопрос в том, «что можно было сделать в данном конкретном случае?» Кроме того, на bobby-tables.com очень мало оскорбительных материалов.

Federico klez Culloca 24.08.2018 15:02

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

toongeorges 28.08.2018 17:56

@FedericoklezCulloca, гадости на bobby-tables.com есть в мультфильме. Вы создаете имя пользователя SQL из 4 частей: случайное имя, строка '); чтобы закрыть запрос, все SQL-запросы, которые вы хотите внедрить, строка - чтобы игнорировать оставшуюся часть исходного запроса, чтобы ваш внедренный запрос был синтаксически правильным.

toongeorges 28.08.2018 18:52

ваш новый ответ великолепен. Я приму это. Спасибо.

Csa77 29.08.2018 15:50

Другие вопросы по теме