Что это за строка?

Строка '))) AND EXTRACTVALUE(2096,CONCAT(0x7e,((SELECT (ELT(2096=2096,1)))),0x7e))-- - представляет собой классический пример error-based SQL-инъекции для СУБД MySQL. Она предназначена для извлечения данных из базы через вывод сообщения об ошибке. Подобные конструкции часто встречаются в отчётах об уязвимостях и в инструментах для тестирования на проникновение, таких как sqlmap.

Разбор компонентов инъекции

EXTRACTVALUE

Функция EXTRACTVALUE(XML_frag, XPath_expr) извлекает значение из фрагмента XML, используя выражение XPath. Если XPath-выражение возвращает несколько узлов или содержит недопустимые символы, MySQL генерирует ошибку. Злоумышленники используют это для вывода данных в сообщении об ошибке.

CONCAT и 0x7e

CONCAT объединяет строки. 0x7e — это шестнадцатеричное представление символа тильды (~). Тильда используется как разделитель, чтобы облегчить извлечение данных из текста ошибки.

ELT и условие 2096=2096

ELT(N, str1, str2, ...) возвращает N-ю строку из списка. В данном случае ELT(2096=2096,1) возвращает 1, так как условие истинно. Это простой способ проверить, что инъекция работает, и получить предсказуемый результат.

Комментарий -- -

Последовательность -- - — это комментарий в SQL. Он отсекает оставшуюся часть оригинального запроса, чтобы не нарушать синтаксис.

Как это работает

Когда уязвимый параметр подставляется в SQL-запрос, злоумышленник может добавить свой код. Например, если исходный запрос был:

SELECT * FROM users WHERE id = '$id'

и $id равен '))) AND EXTRACTVALUE(2096,CONCAT(0x7e,((SELECT (ELT(2096=2096,1)))),0x7e))-- -, то итоговый запрос станет:

SELECT * FROM users WHERE id = ''))) AND EXTRACTVALUE(2096,CONCAT(0x7e,((SELECT (ELT(2096=2096,1)))),0x7e))-- -'

База данных выполнит EXTRACTVALUE, и если XPath-выражение содержит символ, недопустимый в XPath (например, тильду), возникнет ошибка. В тексте ошибки будет содержаться результат подзапроса, обрамлённый тильдами. Так злоумышленник может извлекать данные посимвольно или целыми строками.

Цель инъекции

Основная цель — получить информацию из базы данных: имена таблиц, колонок, логины, пароли и другие конфиденциальные данные. Error-based инъекции эффективны, когда приложение выводит сообщения об ошибках СУБД на страницу.

Пример извлечения данных

Вместо ELT(2096=2096,1) можно подставить подзапрос, возвращающий нужные данные. Например, чтобы узнать имя пользователя, можно использовать:

EXTRACTVALUE(1,CONCAT(0x7e,(SELECT user()),0x7e))

В ответе появится ошибка вида: XPATH syntax error: '~root@localhost~'.

Защита от SQL-инъекций

Чтобы предотвратить такие атаки, необходимо:

  • Использовать подготовленные выражения (prepared statements) с параметризацией.
  • Экранировать все пользовательские данные, попадающие в SQL-запросы.
  • Отключить вывод подробных сообщений об ошибках СУБД в production-окружении.
  • Применять принцип наименьших привилегий для учётной записи базы данных.
  • Регулярно обновлять СУБД и использовать WAF (Web Application Firewall).

Заключение

Строка '))) AND EXTRACTVALUE(2096,CONCAT(0x7e,((SELECT (ELT(2096=2096,1)))),0x7e))-- - — это учебный пример error-based SQL-инъекции. Понимание таких конструкций помогает разработчикам и специалистам по безопасности лучше защищать веб-приложения. Если вы обнаружили подобную уязвимость на своём сайте, немедленно примите меры по её устранению.

Источники