Что это за строка?
Строка %') AND EXTRACTVALUE(8074,CONCAT(0x7e,((SELECT (ELT(8074=8074,1)))),0x7e))-- - представляет собой классический пример error-based SQL-инъекции (инъекции на основе ошибок) для СУБД MySQL. Такие конструкции используются злоумышленниками для извлечения данных из базы данных путём провоцирования ошибок, в тексте которых возвращается нужная информация.
Подобные payload'ы часто встречаются в отчётах об уязвимостях, при пентестах и в логах веб-серверов. Понимание того, как они работают, необходимо как специалистам по безопасности, так и разработчикам, чтобы своевременно закрывать дыры.
Как работает error-based SQL-инъекция
Обычная SQL-инъекция позволяет внедрить произвольный SQL-код в запрос. Error-based инъекция — это техника, при которой атакующий заставляет базу данных выдать сообщение об ошибке, содержащее результат выполнения подзапроса. В MySQL для этого часто используют функции EXTRACTVALUE и UPDATEXML, которые предназначены для работы с XML, но при некорректных аргументах возвращают ошибку с фрагментом переданных данных.
В нашем примере:
EXTRACTVALUE(8074, CONCAT(0x7e, (SELECT ...), 0x7e))— первый аргумент (8074) — это XML-документ (произвольное число, которое не является валидным XML), второй аргумент — XPath-выражение. Если XPath-выражение некорректно, MySQL выдаёт ошибку видаXPATH syntax error: '~...~', где...— это результат вычисления вложенного подзапроса.0x7e— это шестнадцатеричное представление символа~(тильда). Он используется как разделитель, чтобы в сообщении об ошибке было легко выделить полезную нагрузку.ELT(8074=8074,1)— функцияELT(N, str1, str2, ...)возвращает N-ю строку из списка. В данном случае условие8074=8074всегда истинно (возвращает 1), поэтомуELT(1,1)вернёт строку '1'. Это простейший тестовый пример, который проверяет, что инъекция работает: в ошибке появится '~1~'.-- -— это комментарий, который отсекает оставшуюся часть оригинального SQL-запроса, чтобы синтаксис оставался корректным.
Таким образом, при выполнении уязвимого запроса в ответе сервера (или в логах) появится сообщение об ошибке, содержащее '~1~'. Злоумышленник может заменить ELT(8074=8074,1) на любой другой подзапрос, например, (SELECT version()), чтобы получить версию СУБД, или (SELECT password FROM users LIMIT 1), чтобы украсть хеш пароля.
Зачем нужны 0x7e и ELT?
Символ 0x7e (тильда) выбран не случайно: он редко встречается в обычных данных и позволяет легко найти границы извлечённой строки в сообщении об ошибке. Без разделителя, если подзапрос вернёт пустую строку или строку с пробелами, её будет сложно идентифицировать.
Функция ELT здесь используется как простой способ вернуть заранее известное значение (1), чтобы протестировать наличие уязвимости. В реальных атаках вместо неё подставляют вызовы других функций, например CONCAT, GROUP_CONCAT или подзапросы SELECT.
Пример эксплуатации
Предположим, на сайте есть страница product.php?id=1, и параметр id подставляется в SQL-запрос без экранирования. Атакующий может отправить:
product.php?id=1%27 AND EXTRACTVALUE(8074,CONCAT(0x7e,(SELECT database()),0x7e))-- -
В ответе сервера появится ошибка:
XPATH syntax error: '~mydatabase~'
Так злоумышленник узнаёт имя текущей базы данных. Аналогично можно извлечь имена таблиц, столбцов и содержимое записей.
Как защититься от error-based SQL-инъекций
Основной метод защиты — использование параметризованных запросов (prepared statements). Это надёжно отделяет данные от SQL-кода и делает инъекции невозможными. Дополнительные меры:
- Валидация и фильтрация всех входных данных, особенно тех, что попадают в SQL-запросы.
- Отключение вывода подробных сообщений об ошибках на продакшене (display_errors = Off), чтобы злоумышленник не мог видеть текст ошибок.
- Использование ORM или query builder, которые автоматически экранируют параметры.
- Регулярное обновление СУБД и фреймворков для закрытия известных уязвимостей.
- Применение WAF (Web Application Firewall) для блокировки подозрительных запросов, хотя это не заменяет исправление кода.
Важно понимать, что error-based инъекция — лишь один из многих типов атак. Полноценная защита требует комплексного подхода: безопасная разработка, аудит кода, пентесты и мониторинг.
Заключение
Строка с EXTRACTVALUE — это не случайный набор символов, а тщательно сконструированный эксплойт, использующий особенности MySQL для извлечения данных через сообщения об ошибках. Знание таких техник помогает специалистам по безопасности выявлять уязвимости, а разработчикам — писать защищённый код. Если вы обнаружили подобные строки в логах своего сайта, это серьёзный повод провести аудит безопасности и проверить, не осталось ли в коде мест, где пользовательские данные попадают в SQL-запросы без обработки.
Комментарии
—Войдите, чтобы оставить комментарий