Что это за строка?
Строка ))) AND EXTRACTVALUE(7408,CONCAT(0x7e,((SELECT (ELT(7408=7408,1)))),0x7e))-- - — это классический пример error-based SQL-инъекции (инъекции на основе ошибок) для СУБД MySQL. Такие конструкции используют для извлечения данных из базы данных через сообщения об ошибках, которые возвращает сервер.
Подобные строки часто встречаются в логах веб-серверов или в полях ввода, когда злоумышленник пытается протестировать уязвимость сайта. В данном случае строка начинается с ))) — это попытка «закрыть» предыдущие скобки в оригинальном SQL-запросе, чтобы внедрить свой код. Затем идёт AND EXTRACTVALUE(...) — вызов функции, которая генерирует ошибку с полезной нагрузкой. В конце -- - — комментарий, который отсекает оставшуюся часть исходного запроса.
Как работает error-based SQL-инъекция?
MySQL имеет несколько функций, которые при определённых аргументах вызывают ошибку с текстом, содержащим результат подзапроса. Одна из них — EXTRACTVALUE(). Синтаксис: EXTRACTVALUE(XML_document, XPath_expression). Если второй аргумент содержит недопустимый XPath, MySQL возвращает ошибку вида XPATH syntax error: '...', где ... — это переданная строка.
В нашем случае:
7408— произвольное число (идентификатор), не влияет на работу.CONCAT(0x7e, ((SELECT (ELT(7408=7408,1)))), 0x7e)— формирует строку:~(0x7e) + результат подзапроса +~.ELT(7408=7408,1)— функцияELT(N, str1, str2, ...)возвращает строку под номером N. Здесь7408=7408— это логическое выражение, которое всегда истинно (1). Таким образом,ELT(1,1)возвращает1.- Итог:
CONCAT('~', '1', '~')='~1~'. - Далее
EXTRACTVALUE(7408, '~1~')пытается интерпретировать'~1~'как XPath. Символ~недопустим в XPath, поэтому MySQL выдаёт ошибку:XPATH syntax error: '~1~'.
Таким образом, в сообщении об ошибке появляется результат выполнения подзапроса. В реальной атаке вместо ELT(7408=7408,1) мог бы быть, например, (SELECT password FROM users LIMIT 1), и тогда ошибка содержала бы пароль.
Зачем злоумышленник использует такую конструкцию?
Цель — заставить сервер вернуть данные, которые обычно не отображаются на странице. Если приложение выводит сообщения об ошибках СУБД, атакующий может получить информацию о структуре базы данных, учётных записях, паролях и других конфиденциальных данных. Error-based инъекции особенно эффективны, когда нет возможности использовать UNION-запросы (например, из-за несовпадения числа столбцов).
Важно: подобные строки в логах — признак того, что сайт пытались взломать. Если вы видите такую запись, стоит проверить код на наличие уязвимостей.
Как защититься от SQL-инъекций?
Основная мера — использование параметризованных запросов (prepared statements) с привязкой переменных. Это предотвращает внедрение произвольного SQL-кода. Также рекомендуется:
- Экранировать специальные символы (например, с помощью
mysqli_real_escape_stringв PHP). - Отключить вывод подробных ошибок СУБД в продакшене.
- Использовать ORM или query builder, которые автоматически экранируют данные.
- Регулярно проводить аудит безопасности и сканирование уязвимостей.
В случае с EXTRACTVALUE и подобными функциями, начиная с MySQL 5.7.8, некоторые из них могут быть отключены или работать иначе, но полагаться на это нельзя — правильная защита на уровне кода.
Пример легитимного использования EXTRACTVALUE
Функция EXTRACTVALUE предназначена для извлечения значений из XML-документов по XPath-выражению. Например:
SELECT EXTRACTVALUE('<root><user>admin</user></root>', '/root/user');
Вернёт admin. Однако в веб-приложениях её редко используют, поэтому появление EXTRACTVALUE в пользовательском вводе — почти наверняка попытка инъекции.
Вывод
Строка ))) AND EXTRACTVALUE(7408,CONCAT(0x7e,((SELECT (ELT(7408=7408,1)))),0x7e))-- - — это учебный пример error-based SQL-инъекции для MySQL. Она демонстрирует, как злоумышленники могут извлекать данные через сообщения об ошибках. Владельцам сайтов следует быть бдительными и применять современные методы защиты.
Комментарии
—Войдите, чтобы оставить комментарий