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

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

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

Как работает error-based инъекция

Метод основан на том, что СУБД MySQL при некорректном вызове некоторых функций возвращает сообщение об ошибке, в которое попадают переданные аргументы. Если в качестве аргумента передать результат подзапроса, этот результат отобразится в тексте ошибки и станет виден атакующему.

Функция EXTRACTVALUE(XML_document, XPath_expression) извлекает значение из XML-документа по XPath-выражению. Если XPath-выражение синтаксически неверно, MySQL генерирует ошибку вида «XPATH syntax error: '...'», подставляя в неё фрагмент переданного выражения. Именно это и позволяет «вытащить» данные.

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

Рассмотрим конструкцию детально:

  • %' — попытка закрыть строковый литерал в исходном запросе. Символ % часто используется в LIKE-запросах, а одинарная кавычка разрывает строку, позволяя внедрить собственный SQL-код.
  • AND — логический оператор, который добавляет условие к исходному запросу. Если исходный запрос был истинным, добавление AND с внедрённым выражением не меняет логику, но выполняет полезную нагрузку.
  • EXTRACTVALUE(2674, ...) — вызов уязвимой функции. Первый аргумент (2674) — произвольное число, которое не играет роли, так как всё равно будет ошибка.
  • CONCAT(0x7e, ..., 0x7e) — конкатенация. 0x7e — шестнадцатеричное представление символа ~ (тильда). Тильда используется как маркер, чтобы в сообщении об ошибке было легко найти начало и конец извлечённых данных.
  • (SELECT (ELT(2674=2674,1))) — подзапрос, возвращающий значение. ELT(N, str1, str2, ...) возвращает строку по номеру. Если условие 2674=2674 истинно (а оно всегда истинно), то ELT вернёт 1. В реальной атаке вместо 1 мог бы быть, например, version() или database(), но здесь показан простейший тестовый пример.
  • -- - — комментарий, который «отрезает» оставшуюся часть исходного запроса, чтобы не возникало синтаксических ошибок.

В результате выполнения такого запроса MySQL попытается вычислить XPath-выражение, содержащее символ ~, что приведёт к ошибке с текстом, включающим этот символ и результат подзапроса. Атакующий увидит что-то вроде: XPATH syntax error: '~1~'.

Зачем нужен ELT и условие 2674=2674

Конструкция ELT(2674=2674,1) — это простейший способ вернуть предсказуемое значение. В реальных атаках вместо жёсткого 1 подставляют вызовы функций, возвращающих полезные данные: имя текущей базы данных, версию СУБД, имена таблиц и колонок, хэши паролей и т.п. Условие 2674=2674 всегда истинно, поэтому ELT возвращает первый элемент. Если бы условие было ложным, ELT вернул бы NULL, и ошибка выглядела бы иначе — это позволяет реализовывать слепые инъекции, но в данном случае используется именно error-based подход.

Как злоумышленник использует такую строку

Обычно payload внедряется в параметры, которые попадают в SQL-запрос без должной обработки: GET/POST-параметры, cookies, заголовки User-Agent и Referer. Если приложение уязвимо, база данных выполнит вредоносный код, и в ответе сервера (или в логах ошибок) появится информация, которую атакующий сможет прочитать.

Error-based инъекция — один из самых быстрых способов извлечения данных, так как не требует множества запросов (в отличие от blind SQL-инъекций). Однако она работает только тогда, когда приложение выводит сообщения об ошибках базы данных пользователю. Многие современные фреймворки и CMS подавляют такие ошибки, что снижает риск.

Меры защиты

Чтобы предотвратить подобные атаки, разработчикам следует:

  • Использовать параметризованные запросы (prepared statements) — это самый надёжный способ.
  • Применять ORM и библиотеки, которые автоматически экранируют опасные символы.
  • Отключить вывод ошибок СУБД в production-окружении.
  • Ограничить права пользователя базы данных, от имени которого работает приложение (принцип наименьших привилегий).
  • Регулярно проводить аудит кода и использовать сканеры уязвимостей (SAST/DAST).

Важно понимать, что строка с EXTRACTVALUE — это не вирус и не вредоносная программа, а всего лишь тестовый пример, демонстрирующий уязвимость. Её наличие в логах может указывать на попытки взлома, и такие события следует расследовать.

Итог

Рассмотренная конструкция — типичный пример error-based SQL-инъекции для MySQL, использующий функцию EXTRACTVALUE для вывода данных через сообщение об ошибке. Символ ~ (0x7e) служит маркером, а ELT с всегда истинным условием возвращает предсказуемое значение. Понимание таких payload помогает разработчикам и специалистам по безопасности лучше защищать веб-приложения.