Что это за строка?
Строка %" OR EXTRACTVALUE(1745,CONCAT(0x7e,((SELECT (ELT(1745=1745,1)))),0x7e))-- - — это классический пример error-based SQL-инъекции (инъекции на основе ошибок) для СУБД MySQL. Такие конструкции используют для извлечения данных из базы через сообщения об ошибках, которые возвращает сервер. Подобные строки часто встречаются в логах веб-серверов, в полях ввода форм или в параметрах URL, когда злоумышленник пытается протестировать сайт на уязвимость.
Разбор по частям
Давайте разберём каждый элемент запроса.
%"— начало, имитирующее закрытие строкового литерала в исходном SQL-запросе. Символ%часто используется в LIKE-запросах, а кавычка"— для выхода из строки.OR— логический оператор, который делает условие всегда истинным или добавляет новую логику.EXTRACTVALUE(1745, CONCAT(...))— функция MySQL, предназначенная для извлечения значения из XML-документа по XPath-выражению. Если XPath-выражение некорректно, функция возвращает ошибку, в тексте которой может содержаться переданная строка.CONCAT(0x7e, (SELECT (ELT(1745=1745,1))), 0x7e)— конкатенация символа~(0x7e), результата подзапроса и снова~.ELT(1745=1745,1)— функция, возвращающая N-й элемент из списка. Здесь условие1745=1745всегда истинно, поэтому возвращается1. Это простейший пример; на практике вместо1подставляют подзапросы для извлечения данных (например, версии БД, имён таблиц, паролей).-- -— комментарий, который отсекает остаток исходного запроса.
Как работает error-based SQL-инъекция
MySQL-функция EXTRACTVALUE() при передаче некорректного XPath-выражения генерирует ошибку вида: XPATH syntax error: '~1~'. Злоумышленник может подставить в XPath результат подзапроса, и этот результат отобразится в сообщении об ошибке. Таким образом, даже если приложение не выводит данные напрямую, ошибка становится каналом утечки информации.
Например, запрос EXTRACTVALUE(1, CONCAT(0x7e, (SELECT version()), 0x7e)) вернёт ошибку с версией MySQL.
В нашем случае ELT(1745=1745,1) возвращает 1, и ошибка будет содержать ~1~. Это тестовый запрос, чтобы убедиться, что инъекция работает.
Почему это опасно?
SQL-инъекции — одна из самых распространённых уязвимостей веб-приложений (OWASP Top 10). Они позволяют злоумышленнику:
- получить доступ к конфиденциальным данным (логины, пароли, персональные данные);
- изменить или удалить информацию в базе;
- выполнить произвольные команды на сервере в некоторых конфигурациях.
Error-based инъекции особенно удобны для атакующего, потому что не требуют слепого перебора — сервер сам сообщает нужные данные в тексте ошибки.
Как защититься?
- Используйте параметризованные запросы (prepared statements). Это самый надёжный способ, при котором данные никогда не интерпретируются как SQL-код.
- Экранируйте специальные символы. Если параметризация невозможна, применяйте функции экранирования, предоставляемые драйвером БД.
- Ограничьте права пользователя БД. Веб-приложение не должно работать под root или с правами на удаление таблиц.
- Отключайте вывод ошибок в production. Сообщения об ошибках не должны попадать к пользователю.
- Используйте WAF (Web Application Firewall). Он может блокировать подозрительные запросы, содержащие
EXTRACTVALUE,CONCATи другие характерные функции.
Пример безопасного кода на PHP (PDO)
$stmt = $pdo->prepare('SELECT * FROM users WHERE name = :name');
$stmt->execute(['name' => $userInput]);
В этом случае даже если пользователь введёт %" OR EXTRACTVALUE(...), запрос будет обработан как строка, а не как SQL-код.
Что делать, если вы нашли такую строку в логах?
Если вы администратор и видите подобные записи в логах, это может означать, что ваш сайт пытались взломать. Необходимо:
- проверить код на наличие уязвимостей (особенно места, где пользовательский ввод попадает в SQL-запросы);
- обновить CMS и библиотеки до последних версий;
- провести аудит безопасности;
- настроить мониторинг и оповещения о подозрительной активности.
Заключение
Строка %" OR EXTRACTVALUE(1745,CONCAT(0x7e,((SELECT (ELT(1745=1745,1)))),0x7e))-- - — это не случайный набор символов, а целенаправленная попытка эксплуатации SQL-инъекции. Понимание того, как работают такие атаки, помогает разработчикам и администраторам защищать свои системы. Всегда используйте параметризованные запросы и следите за безопасностью своего веб-приложения.
Комментарии
—Войдите, чтобы оставить комментарий