Пожалуйста, обратите внимание, что пользователь заблокирован
Вы знакомы с эксплуатацией HQL-инъекций? Скорее всего, нет. Хотя вы можете предположить, что это интуитивно понятно, поскольку оно связано с SQL-инъекцией, вы правы, но это немного сложнее.
HQL означает Hibernate Query Language. Hibernate - это объектно-реляционное отображение (ORM), которое сопоставляет определение класса (в исходном коде) со связанными таблицами SQL. HQL - это язык, похожий на SQL, но работающий с постоянными объектами вместо непосредственной работы с таблицами и столбцами. HQL-запрос переводится в SQL с помощью инфраструктуры Hibernate, затем SQL-запрос передается в базу данных.
Если у нас есть инъекция в синтаксисе HQL, мы не сможем использовать ее как обычную инъекцию SQL, поскольку язык HQL имеет свой собственный синтаксис и более ограничен (например, нет способа запрашивать не отображенные таблицы). Но пару лет назад российские специалисты по безопасности нашли способ вырваться из контекста HQL в контекст SQL и напрямую связаться с базой данных. Если честно, я не смог найти ни одной английской статьи о том, как ее использовать, но есть несколько хороших российских исследований. Я покажу, как его использовать, на примере, который я недавно нашел во время проекта для клиента. Методы экранирования различны для разных баз данных, и в моем случае это была база данных MySQL.
Первоначальный запрос / ответ и параметр, на которые я обратил внимание, были (тело POST в формате GWT):
Когда я помещаю цитату в параметр, сервер выдает ошибку в ответе:
Такие специальные символы, как вертикальная черта (‘|’) или обратная косая черта (‘\’), нарушают синтаксис GWT, поэтому мне нужно правильно их кодировать. Дополнительное кодирование для формата GWT:
После небольшого исследования, играя с самыми известными базами данных, такими как MySQL, MSSQL, Oracle, последняя полезная нагрузка могла работать только для MySQL. Итак, только теперь я мог попытаться вырваться из контекста HQL.
Набор символов \ '' (обратная косая черта, одинарные кавычки, одинарные кавычки) экранируется из контекста HQL в контекст MySQL. Одинарная кавычка экранирует другую одинарную кавычку в контексте запроса HQL, но обратный слеш - это обычный символ. Для MySQL все наоборот: обратная косая черта экранирует одинарную кавычку, но не другую одинарную кавычку. Следовательно, когда Hibernate Framework анализирует запрос, он видит один запрос, а когда дело доходит до базы данных MySQL, MySQL видит другой запрос.
Hibernate видит:
Полезная нагрузка идет на MySQL, и MySQL видит:
На приведенном ниже снимке экрана показан положительный результат использования полезной нагрузки (ответ «ОК»):
После того, как мне удалось сделать, я захотел получить некоторую информацию из базы данных. Инъекция появляется в части запроса
Важной частью является то, что ошибка генерируется только после оценки второго параметра (который содержит предложение if). Таким образом, в зависимости от того, успешно ли выполнено предложение «if», приложение возвращает или не возвращает ошибку. Этот тип инъекций называется «слепым» слепым внедрением HQL. Это позволяет злоумышленнику извлекать данные посимвольно.
На снимке экрана показан процесс выявления персонажей одного за другим с помощью Burp Suite Intruder:
Вывод будет:
И, наконец, декодированное значение '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/
HQL означает Hibernate Query Language. Hibernate - это объектно-реляционное отображение (ORM), которое сопоставляет определение класса (в исходном коде) со связанными таблицами SQL. HQL - это язык, похожий на SQL, но работающий с постоянными объектами вместо непосредственной работы с таблицами и столбцами. HQL-запрос переводится в SQL с помощью инфраструктуры Hibernate, затем SQL-запрос передается в базу данных.
Если у нас есть инъекция в синтаксисе HQL, мы не сможем использовать ее как обычную инъекцию SQL, поскольку язык HQL имеет свой собственный синтаксис и более ограничен (например, нет способа запрашивать не отображенные таблицы). Но пару лет назад российские специалисты по безопасности нашли способ вырваться из контекста HQL в контекст SQL и напрямую связаться с базой данных. Если честно, я не смог найти ни одной английской статьи о том, как ее использовать, но есть несколько хороших российских исследований. Я покажу, как его использовать, на примере, который я недавно нашел во время проекта для клиента. Методы экранирования различны для разных баз данных, и в моем случае это была база данных MySQL.
Первоначальный запрос / ответ и параметр, на которые я обратил внимание, были (тело POST в формате GWT):
Когда я помещаю цитату в параметр, сервер выдает ошибку в ответе:
Такие специальные символы, как вертикальная черта (‘|’) или обратная косая черта (‘\’), нарушают синтаксис GWT, поэтому мне нужно правильно их кодировать. Дополнительное кодирование для формата GWT:
- | => \!
- \ => \\
| Payload | Result |
|---|---|
| orderInGroup' | error (EX) |
| 'orderInGroup' | ok (OK) |
| 'orderInGroup'\!\!'x | error (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 На приведенном ниже снимке экрана показан положительный результат использования полезной нагрузки (ответ «ОК»):
После того, как мне удалось сделать, я захотел получить некоторую информацию из базы данных. Инъекция появляется в части запроса
'order by'. Поскольку приложение не отображает запрошенные данные, я использовал технику эксплуатации «на основе булевых слепых». Функция MySQL updatexml является наиболее подходящей для этой цели, потому что она имеет определенное поведение: она выдает ошибку, если второй параметр не является допустимой строкой запроса XPath, или не возвращает значения, если запрос XPath правильный.updatexml(xml_target,xpath_expr,new_xml) Важной частью является то, что ошибка генерируется только после оценки второго параметра (который содержит предложение if). Таким образом, в зависимости от того, успешно ли выполнено предложение «if», приложение возвращает или не возвращает ошибку. Этот тип инъекций называется «слепым» слепым внедрением HQL. Это позволяет злоумышленнику извлекать данные посимвольно.
На снимке экрана показан процесс выявления персонажей одного за другим с помощью Burp Suite Intruder:
Вывод будет:
И, наконец, декодированное значение '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/