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

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

Внешне это выглядит как бессмысленный набор символов, но на самом деле здесь заложен чёткий алгоритм: сначала закрывается предыдущий контекст запроса (символ )), затем добавляется условие AND, вызывающее функцию EXTRACTVALUE, которая при определённых условиях генерирует ошибку, содержащую результат подзапроса. В конце идёт комментарий -- -, который «отрезает» оставшуюся часть оригинального SQL-запроса.

Разбор по частям

1. Закрывающая скобка и оператор AND

Символ ) закрывает скобку, которая, вероятно, была открыта в уязвимом запросе. Например, если приложение формирует запрос вида SELECT * FROM users WHERE id = (какой-то_параметр), то внедрение начинается с закрытия этой скобки. Далее AND добавляет новое условие, которое должно быть истинным, чтобы запрос выполнился.

2. Функция EXTRACTVALUE

EXTRACTVALUE(XML_document, XPath_expression) — это встроенная функция MySQL, предназначенная для извлечения значения из XML-документа по заданному XPath-выражению. Однако при передаче некорректного XPath-выражения она вызывает ошибку, текст которой содержит переданное выражение. Это и используется для внедрения.

В нашем случае: EXTRACTVALUE(8288, CONCAT(0x7e, (подзапрос), 0x7e)). Первый аргумент (8288) — произвольное число, которое не влияет на результат. Второй аргумент — это XPath-выражение, которое формируется динамически с помощью CONCAT. Символы 0x7e — это шестнадцатеричное представление тильды (~), которая используется как разделитель, чтобы облегчить извлечение данных из сообщения об ошибке.

3. Подзапрос с ELT

ELT(N, str1, str2, ...) возвращает N-ю строку из списка. В нашем случае: ELT(8288=8288, 1). Выражение 8288=8288 всегда истинно, что в числовом контексте даёт 1. Таким образом, ELT(1, 1) возвращает строку '1'. Это простейший пример, демонстрирующий работу техники. В реальной атаке вместо 1 мог бы быть подзапрос, извлекающий, например, имя пользователя или хеш пароля.

Вся конструкция ((SELECT (ELT(8288=8288,1)))) возвращает строку '1', которая затем подставляется в XPath-выражение. В результате EXTRACTVALUE получает выражение вида ~1~, что не является корректным XPath, и MySQL генерирует ошибку: XPATH syntax error: '~1~'.

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

Два дефиса и пробел (или дефис) обозначают начало комментария в MySQL. Всё, что идёт после -- -, игнорируется парсером. Это позволяет злоумышленнику «обезвредить» остаток оригинального запроса, который мог бы вызвать синтаксическую ошибку.

Как это работает в реальной атаке

Предположим, уязвимый запрос выглядит так:

SELECT * FROM articles WHERE id = ('$input')

Если пользователь передаст в $input нашу строку, запрос превратится в:

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

После подстановки MySQL выполнит EXTRACTVALUE, что приведёт к ошибке, и в ответе сервера появится сообщение с результатом подзапроса. Злоумышленник, анализируя эти ошибки, может посимвольно извлекать данные из базы.

Зачем это нужно злоумышленнику?

Error-based SQL-инъекции позволяют получать информацию о структуре базы данных, таблицах, колонках и непосредственно данные (логины, пароли, персональные сведения). Это один из самых опасных типов атак, так как он не требует слепого перебора и даёт быстрый результат.

Как защититься?

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

Вывод

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

Источники