• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Использование HQL-инъекций в MySQL

NokZKH

Переводчик
Забанен
Регистрация
09.02.2019
Сообщения
99
Реакции
121
Пожалуйста, обратите внимание, что пользователь заблокирован
Вы знакомы с эксплуатацией HQL-инъекций? Скорее всего, нет. Хотя вы можете предположить, что это интуитивно понятно, поскольку оно связано с SQL-инъекцией, вы правы, но это немного сложнее.

HQL означает Hibernate Query Language. Hibernate - это объектно-реляционное отображение (ORM), которое сопоставляет определение класса (в исходном коде) со связанными таблицами SQL. HQL - это язык, похожий на SQL, но работающий с постоянными объектами вместо непосредственной работы с таблицами и столбцами. HQL-запрос переводится в SQL с помощью инфраструктуры Hibernate, затем SQL-запрос передается в базу данных.

Если у нас есть инъекция в синтаксисе HQL, мы не сможем использовать ее как обычную инъекцию SQL, поскольку язык HQL имеет свой собственный синтаксис и более ограничен (например, нет способа запрашивать не отображенные таблицы). Но пару лет назад российские специалисты по безопасности нашли способ вырваться из контекста HQL в контекст SQL и напрямую связаться с базой данных. Если честно, я не смог найти ни одной английской статьи о том, как ее использовать, но есть несколько хороших российских исследований. Я покажу, как его использовать, на примере, который я недавно нашел во время проекта для клиента. Методы экранирования различны для разных баз данных, и в моем случае это была база данных MySQL.

Первоначальный запрос / ответ и параметр, на которые я обратил внимание, были (тело POST в формате GWT):

image1.png


Когда я помещаю цитату в параметр, сервер выдает ошибку в ответе:

2image1.png


Такие специальные символы, как вертикальная черта (‘|’) или обратная косая черта (‘\’), нарушают синтаксис GWT, поэтому мне нужно правильно их кодировать. Дополнительное кодирование для формата GWT:
  • | => \!
  • \ => \\
Прежде чем выйти из контекста HQL, я должен был понять, с какой базой данных я имею дело. Итак, я провел пару тестов:

PayloadResult
orderInGroup'error (EX)
'orderInGroup'ok (OK)
'orderInGroup'\!\!'xerror (EX)
'orderInGroup'\!\!'x'ok (OK)
'orderInGroup'\!\!'x'\!\!''ok (OK)
'orderInGroup'\!\!str(46)\!\!''ok (OK)
'orderInGroup'\!\!substr('x',1,1)\!\!''ok (OK)

После небольшого исследования, играя с самыми известными базами данных, такими как MySQL, MSSQL, Oracle, последняя полезная нагрузка могла работать только для MySQL. Итак, только теперь я мог попытаться вырваться из контекста HQL.

Набор символов \ '' (обратная косая черта, одинарные кавычки, одинарные кавычки) экранируется из контекста HQL в контекст MySQL. Одинарная кавычка экранирует другую одинарную кавычку в контексте запроса HQL, но обратный слеш - это обычный символ. Для MySQL все наоборот: обратная косая черта экранирует одинарную кавычку, но не другую одинарную кавычку. Следовательно, когда Hibernate Framework анализирует запрос, он видит один запрос, а когда дело доходит до базы данных MySQL, MySQL видит другой запрос.

Hibernate видит:

'orderInGroup'||'[B]\''|| (select 1)) --[/B] ' // as a string

Полезная нагрузка идет на MySQL, и MySQL видит:

'orderInGroup'||'[B]\'[/B]'|| [B](select 1)) --[/B] ' // string '\'', logical 'or', select query

На приведенном ниже снимке экрана показан положительный результат использования полезной нагрузки (ответ «ОК»):

3.png


После того, как мне удалось сделать, я захотел получить некоторую информацию из базы данных. Инъекция появляется в части запроса 'order by'. Поскольку приложение не отображает запрошенные данные, я использовал технику эксплуатации «на основе булевых слепых». Функция MySQL updatexml является наиболее подходящей для этой цели, потому что она имеет определенное поведение: она выдает ошибку, если второй параметр не является допустимой строкой запроса XPath, или не возвращает значения, если запрос XPath правильный.

updatexml(xml_target,xpath_expr,new_xml)

Важной частью является то, что ошибка генерируется только после оценки второго параметра (который содержит предложение if). Таким образом, в зависимости от того, успешно ли выполнено предложение «if», приложение возвращает или не возвращает ошибку. Этот тип инъекций называется «слепым» слепым внедрением HQL. Это позволяет злоумышленнику извлекать данные посимвольно.

На снимке экрана показан процесс выявления персонажей одного за другим с помощью Burp Suite Intruder:

4.png


Вывод будет:

5.png


И, наконец, декодированное значение 'user ()' равно [...] PROD_SELF [...] '.

Дополнительные примеры для других баз данных, таких как Oracle, Postgresql и MSSQL, можно найти здесь.

Переведено специально для https://xss.pro
Переводчик статьи - https://xss.pro/members/177895/
Оригинал - https://www.trustwave.com/en-us/resources/blogs/spiderlabs-blog/hql-injection-exploitation-in-mysql/
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх