Что это за строка?
Строка ) OR EXTRACTVALUE(7602,CONCAT(0x7e,((SELECT (ELT(7602=7602,1)))),0x7e))-- - — это классический пример error-based SQL-инъекции (инъекции на основе ошибок) для СУБД MySQL. Такие конструкции используют для извлечения данных из базы через сообщения об ошибках, которые возвращает сервер.
Подобные запросы часто встречаются в отчётах сканеров уязвимостей, в логах веб-серверов, в практических заданиях на платформах вроде DVWA, SQLZoo и в шпаргалках пентестеров. Если вы увидели такую строку — значит, кто-то (или автоматический сканер) проверял ваш сайт на наличие SQL-инъекций.
Разбираем конструкцию по частям
1. Закрывающая скобка и OR
Строка начинается с ) и OR. Это попытка «вырваться» из оригинального SQL-запроса, который, вероятно, выглядел как SELECT ... WHERE id = (какой-то параметр). Закрывающая скобка завершает исходное выражение, а OR позволяет добавить своё условие, не ломая синтаксис всего запроса.
2. Функция EXTRACTVALUE
EXTRACTVALUE(XML_fragment, XPath_expression) — встроенная функция MySQL для работы с XML. Она извлекает значение из XML-документа по XPath-выражению. Если XPath-выражение некорректно, MySQL выбрасывает ошибку вида XPATH syntax error: '...', в которой отображается проблемный фрагмент.
Именно эта особенность делает функцию идеальным инструментом для error-based инъекции: злоумышленник может подставить в XPath-выражение результат подзапроса, и сервер вернёт его в тексте ошибки.
3. CONCAT и 0x7e
CONCAT(0x7e, ..., 0x7e) — склеивает строки. 0x7e — это шестнадцатеричный код символа ~ (тильда). Тильды служат маркерами, чтобы в сообщении об ошибке было легко найти начало и конец извлечённого значения.
4. Подзапрос SELECT (ELT(7602=7602,1))
ELT(N, str1, str2, ...) возвращает N-ю строку из списка. В данном случае 7602=7602 — это всегда истина (1), поэтому ELT(1, 1) вернёт 1. Это простейшая проверка работоспособности инъекции. В реальной атаке вместо 1 подставляют, например, SELECT password FROM users LIMIT 1, и сервер возвращает пароль в тексте ошибки.
5. Комментарий -- -
-- - — это комментарий в SQL. Всё, что идёт после него, игнорируется. Пробел после -- обязателен, иначе некоторые СУБД не распознают комментарий. Дефис в конце часто добавляют для обхода фильтров, которые удаляют -- без пробела.
Как это работает на практике
Предположим, на сайте есть скрипт, который выполняет запрос:
SELECT * FROM products WHERE id = '$_GET[id]'
Если передать в параметр id строку 1') OR EXTRACTVALUE(7602,CONCAT(0x7e,(SELECT version()),0x7e))-- -, то итоговый запрос станет таким:
SELECT * FROM products WHERE id = '1') OR EXTRACTVALUE(7602,CONCAT(0x7e,(SELECT version()),0x7e))-- -'
MySQL выполнит подзапрос, получит версию сервера, попытается вставить её в XPath, потерпит неудачу и вернёт ошибку примерно такого вида:
XPATH syntax error: '~5.7.33~'
Так злоумышленник узнаёт версию MySQL. Аналогично можно извлечь имена таблиц, колонок, логины и пароли пользователей.
Зачем это нужно злоумышленнику
- Разведка: определить СУБД, её версию, текущего пользователя, права.
- Извлечение данных: получить содержимое таблиц через ошибки, если прямой вывод (UNION) заблокирован.
- Обход фильтров: error-based инъекции часто проходят там, где UNION-инъекции отфильтрованы.
Как защититься
- Используйте подготовленные выражения (prepared statements). Это главный и самый надёжный способ. Параметры передаются отдельно от SQL-кода, и внедрить в них что-либо невозможно.
- Экранируйте пользовательский ввод. Если prepared statements недоступны, применяйте функции экранирования, например
mysqli_real_escape_string(). - Ограничьте права пользователя БД. Не давайте веб-приложению прав на
FILE,DROPи доступ к системным таблицам без необходимости. - Отключите вывод ошибок на продакшене. Сообщения об ошибках MySQL не должны попадать в браузер пользователя — только в логи сервера.
- Используйте WAF. Веб-приложение firewall может отсеивать типичные сигнатуры SQL-инъекций, включая EXTRACTVALUE.
- Регулярно сканируйте сайт. Инструменты вроде SQLMap, OWASP ZAP помогут найти уязвимости до злоумышленников.
Легальные сценарии использования
Подобные конструкции применяются исключительно в легальном пентестинге — при тестировании собственных систем или в рамках договора с заказчиком. Использование SQL-инъекций против чужих сайтов без разрешения является уголовным преступлением (ст. 272 УК РФ — неправомерный доступ к компьютерной информации).
Платформы для обучения, такие как DVWA, SQLZoo, PortSwigger Web Security Academy, дают возможность отрабатывать эти техники в безопасной среде.
Итог
Строка ) OR EXTRACTVALUE(7602,CONCAT(0x7e,((SELECT (ELT(7602=7602,1)))),0x7e))-- - — это не случайный набор символов, а тщательно сконструированный эксплойт для error-based SQL-инъекции в MySQL. Он использует функцию EXTRACTVALUE для вызова ошибки, в тексте которой возвращаются данные из базы. Понимание таких конструкций помогает разработчикам и администраторам лучше защищать свои приложения, а специалистам по безопасности — находить уязвимости до того, как их найдёт злоумышленник.
Комментарии
—Войдите, чтобы оставить комментарий