Что такое OR EXTRACTVALUE(2420,CONCAT(0x7e,((SELECT (ELT(2420=2420,1)))),0x7e))-- -
Перед нами классический пример SQL-инъекции (SQL injection) — атаки, при которой злоумышленник внедряет в запрос к базе данных собственный код. Конструкция OR EXTRACTVALUE(2420,CONCAT(0x7e,((SELECT (ELT(2420=2420,1)))),0x7e))-- - предназначена для извлечения информации из базы данных через механизм ошибок (error-based SQL injection). Она использует несколько встроенных функций СУБД MySQL: EXTRACTVALUE, CONCAT, ELT и SELECT. Разберём её по частям.
Как работает error-based SQL-инъекция
При error-based инъекции атакующий формирует такой запрос, который вызывает ошибку базы данных, содержащую полезные данные (например, версию СУБД, имя пользователя, хеш пароля). Сообщение об ошибке затем отображается на странице или возвращается в ответе сервера, что позволяет злоумышленнику получить конфиденциальную информацию.
В MySQL функции EXTRACTVALUE и UPDATEXML часто используются для генерации ошибок с внедрёнными данными. EXTRACTVALUE принимает XML-документ и XPath-выражение и возвращает скалярное значение. Если XPath-выражение некорректно, MySQL выдаёт ошибку, в текст которой попадает переданный аргумент.
Разбор конструкции по элементам
- OR — логический оператор, который добавляется к условию WHERE исходного запроса, чтобы сделать его всегда истинным (или вызвать выполнение внедрённой функции).
- EXTRACTVALUE(2420, CONCAT(...)) — функция, извлекающая значение из XML. Первый аргумент (2420) — произвольное число, которое должно быть XML-строкой (MySQL автоматически преобразует число в строку). Второй аргумент — XPath-выражение, формируемое динамически через
CONCAT. - CONCAT(0x7e, ((SELECT (ELT(2420=2420,1)))), 0x7e) — объединяет символ тильды (
0x7e— шестнадцатеричный код символа ~), результат подзапроса и ещё одну тильду. Тильда используется как разделитель, чтобы облегчить извлечение данных из сообщения об ошибке. - SELECT (ELT(2420=2420,1)) — подзапрос, возвращающий строку.
ELT(N, str1, str2, ...)возвращает N-ю строку из списка. Здесь2420=2420всегда истинно (равно 1), поэтомуELT(1, 1)вернёт строку '1'. В реальной атаке вместо этой простой проверки мог бы быть подзапрос, извлекающий имя пользователя или хеш пароля. - -- - — комментарий, который обрезает оставшуюся часть исходного SQL-запроса, чтобы синтаксис оставался корректным. Пробел после двух дефисов обязателен в MySQL, а дефис в конце — часто используемая уловка для обхода фильтров.
В результате выполнения такого запроса MySQL попытается интерпретировать строку вида ~1~ как XPath-выражение. Поскольку это не корректный XPath, возникнет ошибка: XPATH syntax error: '~1~'. В сообщении об ошибке отобразится значение, возвращённое подзапросом (в данном случае '1'). Если заменить ELT(2420=2420,1) на подзапрос, возвращающий конфиденциальные данные, эти данные попадут в текст ошибки и станут доступны атакующему.
Зачем нужна такая конструкция
Данная конструкция — это упрощённый пример, демонстрирующий механизм error-based инъекции. В реальных атаках злоумышленники используют подобные шаблоны для:
- получения версии MySQL и другой служебной информации;
- извлечения имён таблиц и столбцов из схемы базы данных (
information_schema); - чтения содержимого таблиц (например, логинов и паролей пользователей);
- обхода фильтров и WAF (Web Application Firewall).
Использование EXTRACTVALUE и UPDATEXML стало популярным потому, что эти функции часто не блокируются простыми сигнатурами, а сообщения об ошибках могут отображаться даже при выключенном выводе ошибок PHP, если приложение не настроено должным образом.
Как защититься от подобных инъекций
Лучший способ предотвратить SQL-инъекции — использовать параметризованные запросы (prepared statements) с привязкой параметров. При этом данные никогда не смешиваются с кодом SQL. Дополнительные меры:
- использовать ORM или хранимые процедуры с параметрами;
- проводить валидацию и санитизацию всех входных данных на стороне сервера;
- ограничивать права пользователя базы данных, от имени которого работает приложение (принцип наименьших привилегий);
- отключать вывод подробных сообщений об ошибках в production-окружении;
- применять WAF для фильтрации подозрительных запросов.
Важно понимать, что конструкция OR EXTRACTVALUE(...) — это не «магическая формула», а индикатор уязвимости. Если вы обнаружили подобные строки в логах или запросах, это повод проверить безопасность вашего приложения.
Заключение
Выражение OR EXTRACTVALUE(2420,CONCAT(0x7e,((SELECT (ELT(2420=2420,1)))),0x7e))-- - — это учебный пример error-based SQL-инъекции, использующий особенности функций MySQL для вызова ошибки с внедрёнными данными. Понимание таких конструкций помогает разработчикам и специалистам по безопасности лучше защищать свои системы. Никогда не используйте подобные приёмы против чужих ресурсов без разрешения — это незаконно.
Комментарии
—Войдите, чтобы оставить комментарий