Что это за строка?
Строка "))) AND EXTRACTVALUE(8134,CONCAT(0x7e,((SELECT (ELT(8134=8134,1)))),0x7e))-- - — это классический пример SQL-инъекции, а именно error-based инъекции через функцию EXTRACTVALUE в СУБД MySQL. Такие строки часто встречаются в логах веб-серверов, в полях ввода форм или в параметрах URL. Их цель — заставить базу данных выдать сообщение об ошибке, содержащее полезные для злоумышленника данные.
Как работает EXTRACTVALUE?
Функция EXTRACTVALUE(XML, XPath) извлекает значение из XML-фрагмента по заданному XPath-выражению. Если XPath-выражение некорректно, MySQL генерирует ошибку вида XPATH syntax error: '...'. Злоумышленники используют это для внедрения произвольных данных в текст ошибки, которые затем можно прочитать в ответе сервера.
Разбор полезной нагрузки
Рассмотрим по частям:
")))— закрывающие кавычки и скобки, чтобы завершить предыдущий SQL-запрос и добавить свой.AND EXTRACTVALUE(8134, CONCAT(0x7e, ((SELECT (ELT(8134=8134,1)))), 0x7e))— вызов функции с заведомо некорректным XPath.0x7e— это тильда (~), используется как разделитель.ELT(8134=8134,1)возвращает 1, если условие истинно (8134=8134 — всегда истина). Это простейшая проверка, но на практике вместо1подставляются подзапросы, извлекающие версию БД, имена таблиц и т.д.-- -— комментарий, обрезающий остаток оригинального запроса.
В результате MySQL попытается выполнить XPath-выражение, содержащее символ ~, что вызовет ошибку с текстом, включающим результат подзапроса. Например: XPATH syntax error: '~1~'.
Зачем это нужно злоумышленнику?
Error-based инъекции позволяют извлекать данные из базы, даже если приложение не выводит результаты запроса напрямую. Ошибки часто отображаются в браузере или логируются, что даёт атакующему информацию о структуре БД, версии MySQL, именах таблиц и полей, а также о содержимом записей.
Пример реальной атаки
Предположим, есть уязвимый параметр id=1. Злоумышленник подставляет:
1 AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT version()), 0x7e))
В ответе сервера появится ошибка: XPATH syntax error: '~5.7.34~'. Так узнаётся версия СУБД. Далее можно извлекать имена таблиц через information_schema.
Как защититься?
- Используйте подготовленные выражения (prepared statements) с параметризацией. Это самый надёжный способ.
- Экранируйте специальные символы при невозможности использовать параметризацию.
- Ограничьте права пользователя БД: не давайте приложению доступ к
information_schemaбез необходимости. - Отключите вывод ошибок в production-окружении, чтобы сообщения MySQL не попадали в ответы.
- Используйте WAF (Web Application Firewall) для фильтрации подозрительных запросов.
- Регулярно обновляйте MySQL и библиотеки доступа к БД.
Заключение
Строка "))) AND EXTRACTVALUE(8134,CONCAT(0x7e,((SELECT (ELT(8134=8134,1)))),0x7e))-- - — это попытка эксплуатации уязвимости SQL-инъекции через функцию EXTRACTVALUE. Понимание механизма таких атак помогает разработчикам и администраторам своевременно закрывать уязвимости и защищать данные.
Комментарии
—Войдите, чтобы оставить комментарий