Что это за строка?
Строка ` OR EXTRACTVALUE(7644,CONCAT(0x7e,((SELECT (ELT(7644=7644,1)))),0x7e))-- - — это классический пример error-based SQL-инъекции (инъекции на основе ошибок) для СУБД MySQL. Такие конструкции используют для извлечения данных из базы через сообщения об ошибках, которые возвращает сервер. Злоумышленник внедряет в уязвимый параметр запроса специально сформированный фрагмент, и если приложение не фильтрует ввод, база данных выполняет вредоносный код и возвращает результат в тексте ошибки.
Разбор по элементам
Символ ` (обратная кавычка)
В MySQL обратная кавычка используется для экранирования идентификаторов (имён таблиц, столбцов). В начале строки она, скорее всего, закрывает ранее открытый идентификатор в оригинальном запросе, чтобы «разорвать» его и добавить собственный код. Это типичный приём при инъекции в параметр, который подставляется в запрос без должной обработки.
OR
Оператор OR изменяет логику существующего условия SQL-запроса. Если исходный запрос проверял, например, id = 1, то добавление OR ... делает условие всегда истинным (или запускает выполнение вложенного выражения), что позволяет обойти аутентификацию или получить доступ к данным.
EXTRACTVALUE(7644, CONCAT(...))
EXTRACTVALUE — функция MySQL, которая извлекает значение из XML-фрагмента. Она часто используется в инъекциях для принудительного вызова ошибки, содержащей полезную нагрузку. Первый аргумент (7644) — произвольное число, второй — строка, сформированная через CONCAT. Если второй аргумент не является корректным XML, MySQL выдаёт ошибку вида XPATH syntax error: '...', в тексте которой оказываются данные, переданные в функцию.
CONCAT(0x7e, ..., 0x7e)
CONCAT объединяет строки. Здесь используются шестнадцатеричные литералы 0x7e — это ASCII-код символа ~ (тильда). Тильда служит маркером, который обрамляет извлекаемые данные, чтобы их было легко найти в сообщении об ошибке. Например, если нужно вытащить версию базы, в середину помещают @@version, и в ошибке появится ~5.7.33~.
SELECT (ELT(7644=7644,1))
ELT — функция MySQL, возвращающая N-й элемент из списка строк. Выражение 7644=7644 всегда истинно (1), поэтому ELT(1,1) вернёт строку '1'. В данном примере это просто демонстрация работоспособности инъекции: в реальной атаке вместо 1 подставляют подзапрос, например (SELECT password FROM users LIMIT 1). Таким образом, ELT позволяет динамически формировать строку для CONCAT.
Комментарий -- -
Два дефиса с пробелом (или -- -) в MySQL начинают комментарий до конца строки. Это нужно, чтобы «отрезать» оставшуюся часть оригинального запроса, которая могла бы вызвать синтаксическую ошибку или помешать выполнению внедрённого кода. Пробел после -- обязателен по стандарту MySQL.
Как это работает на практике
Предположим, есть уязвимый запрос: SELECT * FROM articles WHERE id = '$_GET[id]'. Если передать в параметр id нашу строку, итоговый запрос примет вид:
SELECT * FROM articles WHERE id = '` OR EXTRACTVALUE(7644,CONCAT(0x7e,((SELECT (ELT(7644=7644,1)))),0x7e))-- -'База данных выполнит EXTRACTVALUE, что приведёт к ошибке с текстом, содержащим ~1~. Если приложение выводит ошибки MySQL на экран, злоумышленник увидит этот результат. Заменив 1 на подзапрос, можно извлечь любые данные: имена таблиц, логины, пароли.
Меры защиты
- Параметризованные запросы (prepared statements) — главный способ предотвращения SQL-инъекций. Они разделяют код и данные, поэтому внедрённые строки не интерпретируются как SQL.
- Экранирование специальных символов — используйте функции экранирования, предоставляемые драйвером БД (например,
mysqli_real_escape_stringв PHP). - Отключение вывода ошибок БД — не показывайте пользователям тексты ошибок MySQL, чтобы не давать подсказок атакующему.
- Принцип наименьших привилегий — учётная запись веб-приложения должна иметь только необходимые права (обычно только SELECT/INSERT/UPDATE для конкретных таблиц).
- Регулярное обновление СУБД — исправления закрывают известные уязвимости.
Заключение
Рассмотренная строка — типичный пример error-based SQL-инъекции, использующей функцию EXTRACTVALUE для вызова ошибки с внедрёнными данными. Понимание механики таких атак помогает разработчикам и специалистам по безопасности правильно выстраивать защиту. Никогда не используйте подобные конструкции на реальных системах без разрешения — это незаконно.
Комментарии
—Войдите, чтобы оставить комментарий