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

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

Главная цель — заставить сервер базы данных вернуть в тексте ошибки результат выполнения вложенного SQL-запроса. В данном случае это тривиальный запрос SELECT 1, но на его месте может быть, например, SELECT password FROM users LIMIT 1.

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

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

Начинается строка с ) — это закрывающая скобка, которая «завершает» ранее открытую скобку в уязвимом запросе. Например, если приложение выполняет что-то вроде SELECT * FROM articles WHERE id = (1, то наша инъекция добавит ) и закроет её. Далее идёт AND — логический оператор, который позволяет присоединить дополнительное условие.

2. Функция EXTRACTVALUE

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

В нашем случае первый аргумент — число 1702. Оно не является валидным XML, что уже провоцирует ошибку, но главное — второй аргумент.

3. CONCAT и тильда (0x7e)

CONCAT(0x7e, ..., 0x7e) склеивает строки. 0x7e — это шестнадцатеричный код символа ~ (тильда). Тильда используется как маркер, чтобы в сообщении об ошибке легко найти начало и конец выводимых данных. Например, ошибка может выглядеть так: XPATH syntax error: '~1~'.

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

((SELECT (ELT(1702=1702,1)))) — это вложенный запрос, который возвращает значение. ELT(N, str1, str2, ...) возвращает N-ю строку из списка. Здесь 1702=1702 — всегда истина (1), поэтому ELT(1, 1) вернёт 1. В учебном примере это просто заглушка. В реальной атаке вместо 1 подставляют конкатенацию полей, например CONCAT(login, 0x3a, password).

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

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

Как это работает на практике

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

SELECT * FROM news WHERE id = (1)

После подстановки нашей строки получается:

SELECT * FROM news WHERE id = (1) AND EXTRACTVALUE(1702,CONCAT(0x7e,((SELECT (ELT(1702=1702,1)))),0x7e))-- -)

MySQL выполняет:

  1. Закрывает скобку после 1.
  2. Добавляет условие AND EXTRACTVALUE(...).
  3. Внутри EXTRACTVALUE пытается разобрать XPath, начинающийся с ~1~. Это некорректный XPath, поэтому возникает ошибка.
  4. В тексте ошибки возвращается XPATH syntax error: '~1~'.
  5. Всё после -- - игнорируется.

Атакующий видит в ответе сервера сообщение об ошибке и понимает, что инъекция сработала. Если вместо 1 подставить подзапрос, возвращающий конфиденциальные данные, они также попадут в ошибку.

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

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

Меры защиты

Чтобы подобные строки не попали в SQL-запрос, необходимо:

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

Важно понимать: даже если приложение не выводит ошибки, существуют blind-инъекции, поэтому защита должна быть комплексной.

Является ли это вредоносным?

Сама по себе строка — это лишь фрагмент кода. Она не является вирусом или программой. Это инструмент, который может быть использован как во благо (тестирование на проникновение с разрешения владельца), так и во вред. Публикация таких примеров в образовательных целях помогает разработчикам понять механизмы атак и лучше защищать свои системы.

Заключение

Разобранная конструкция — типичный пример error-based SQL-инъекции через функцию EXTRACTVALUE. Она демонстрирует, как недостаточная фильтрация входных данных и вывод ошибок БД могут привести к утечке информации. Понимание принципов работы таких атак — первый шаг к построению безопасных веб-приложений.

Источники