Что это за строка?
Строка %' 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 помогает разработчикам и специалистам по безопасности лучше защищать веб-приложения.
Комментарии
—Войдите, чтобы оставить комментарий