Что это за строка?
Строка " OR EXTRACTVALUE(7941,CONCAT(0x7e,((SELECT (ELT(7941=7941,1)))),0x7e))-- - — это классический пример error-based SQL-инъекции (инъекции на основе ошибок) для СУБД MySQL. Такие конструкции используют для извлечения данных из базы через сообщения об ошибках, которые возвращает сервер. Злоумышленник внедряет в уязвимый параметр запроса специально сформированный фрагмент, заставляющий СУБД выдать в тексте ошибки результат подзапроса.
Как работает инъекция
Разберём payload по частям:
"— закрывает строковый литерал в исходном запросе, чтобы внедрить свой код.OR— логический оператор, позволяющий обойти условие и выполнить внедрённое выражение.EXTRACTVALUE(7941, CONCAT(...))— функция MySQL, извлекающая значение из XML-фрагмента. При передаче некорректного XPath-выражения она генерирует ошибку, в текст которой попадает переданная строка.CONCAT(0x7e, ((SELECT (ELT(7941=7941,1)))), 0x7e)— конкатенация тильды (0x7e— шестнадцатеричный код символа~), результата подзапроса и ещё одной тильды. Это нужно, чтобы отделить данные в сообщении об ошибке.ELT(7941=7941,1)— функция, возвращающая N-й элемент из списка. Здесь условие7941=7941всегда истинно, поэтому возвращается1. В реальной атаке вместо этого может быть подзапрос, извлекающий логин, пароль или другую конфиденциальную информацию.-- -— комментарий, обрезающий оставшуюся часть исходного запроса.
В результате выполнения такого запроса MySQL выдаст ошибку вида XPATH syntax error: '~1~'. Если вместо 1 подставить подзапрос, например (SELECT password FROM users LIMIT 1), то в тексте ошибки появится хеш пароля. Это позволяет злоумышленнику посимвольно или целиком извлекать данные из базы.
Почему это опасно
Error-based инъекции — один из самых простых и быстрых способов получить доступ к данным. Они не требуют сложной настройки, как blind SQL-инъекции, и сразу возвращают результат в ответе сервера. Если приложение не фильтрует пользовательский ввод и выводит ошибки СУБД на страницу, атакующий может:
- получить доступ к учётным записям пользователей (логины, пароли, хеши);
- извлечь персональные данные (номера телефонов, адреса, платёжную информацию);
- получить сведения о структуре базы данных (имена таблиц, колонок);
- в некоторых случаях — выполнить произвольные SQL-запросы, включая модификацию или удаление данных.
Подобные уязвимости часто становятся причиной крупных утечек. Например, в 2023 году многие веб-приложения на PHP с устаревшими библиотеками были уязвимы к error-based инъекциям через функции EXTRACTVALUE и UPDATEXML.
Пример эксплуатации
Рассмотрим упрощённый сценарий. Исходный запрос в приложении:
SELECT * FROM articles WHERE id = '$_GET[id]'Если передать в параметр id строку 1' OR EXTRACTVALUE(1,CONCAT(0x7e,(SELECT version()),0x7e))-- -, то запрос примет вид:
SELECT * FROM articles WHERE id = '1' OR EXTRACTVALUE(1,CONCAT(0x7e,(SELECT version()),0x7e))-- -'MySQL выполнит подзапрос SELECT version(), получит, например, 8.0.32, затем попытается разобрать строку ~8.0.32~ как XPath и выдаст ошибку: XPATH syntax error: '~8.0.32~'. Эта ошибка вернётся в браузер, и злоумышленник узнает версию СУБД. Аналогично можно извлечь любые другие данные.
Меры защиты
Чтобы предотвратить такие атаки, необходимо применять комплексный подход:
- Параметризованные запросы (prepared statements). Это самый надёжный способ. Вместо конкатенации строк используйте плейсхолдеры и передавайте данные отдельно. Например, в PHP с PDO:
$stmt = $pdo->prepare('SELECT * FROM articles WHERE id = ?'); $stmt->execute([$id]);. - Экранирование специальных символов. Если по каким-то причинам нельзя использовать подготовленные выражения, применяйте функции экранирования, например
mysqli_real_escape_string(). Но помните, что это менее надёжно. - Отключение вывода ошибок СУБД в продакшене. Сообщения об ошибках должны логироваться, а пользователю показываться общая страница ошибки. Это затруднит эксплуатацию error-based инъекций.
- Ограничение прав пользователя базы данных. Приложение должно подключаться к БД под учётной записью с минимально необходимыми правами (только SELECT, INSERT, UPDATE для нужных таблиц). Это снизит ущерб в случае взлома.
- Регулярное обновление СУБД и библиотек. В новых версиях MySQL некоторые опасные функции могут быть удалены или изменены, что усложняет атаку.
- Использование WAF (Web Application Firewall). Современные WAF умеют обнаруживать характерные сигнатуры error-based инъекций, включая
EXTRACTVALUEиUPDATEXML.
Важно понимать, что EXTRACTVALUE и UPDATEXML сами по себе не являются уязвимостями — это штатные функции MySQL. Опасность возникает, когда пользовательский ввод попадает в SQL-запрос без должной обработки. Поэтому главный принцип — никогда не доверять данным от клиента и всегда использовать параметризацию.
Заключение
Строка " OR EXTRACTVALUE(7941,CONCAT(0x7e,((SELECT (ELT(7941=7941,1)))),0x7e))-- - — это не просто случайный набор символов, а рабочий инструмент хакера для проведения error-based SQL-инъекции. Понимание механизма таких атак помогает разработчикам и администраторам лучше защищать свои системы. Используйте подготовленные выражения, скрывайте ошибки и следите за безопасностью — тогда подобные payload'ы не смогут нанести вреда.
Комментарии
—Войдите, чтобы оставить комментарий