Что это за строка?
Строка %' AND EXTRACTVALUE(7748,CONCAT(0x7e,((SELECT (ELT(7748=7748,1)))),0x7e))-- - — это классический пример error-based SQL-инъекции (инъекции на основе ошибок) для СУБД MySQL. Такие конструкции используют для извлечения данных из базы через сообщения об ошибках, которые возвращает сервер.
Она может встретиться в логах веб-сервера, в поле ввода на сайте или в отчётах систем безопасности. Если вы увидели подобное — это почти наверняка попытка взлома или тестирование уязвимости.
Как работает эта инъекция?
Разберём по частям:
%'— закрывает строковый литерал в исходном SQL-запросе и добавляет процент как часть LIKE-условия (часто используется для обхода фильтров).AND EXTRACTVALUE(7748, CONCAT(0x7e, ((SELECT (ELT(7748=7748,1)))), 0x7e))— вызывает функциюEXTRACTVALUE(), которая извлекает значение из XML. Если второй аргумент не является корректным XPath-выражением, MySQL генерирует ошибкуXPATH syntax errorи выводит переданную строку.0x7e— это шестнадцатеричное представление символа~(тильда). Он используется как маркер, чтобы в сообщении об ошибке было легко найти выведенные данные.ELT(7748=7748,1)— функцияELT()возвращает N-й элемент из списка. Здесь условие7748=7748всегда истинно (1), поэтому возвращается первый элемент — число 1. Это простейший пример; на практике вместо1подставляют подзапрос, извлекающий нужные данные (например, имя пользователя, хеш пароля).-- -— комментарий, который отсекает оставшуюся часть оригинального запроса.
В результате сервер возвращает ошибку вида: XPATH syntax error: '~1~'. Злоумышленник видит, что инъекция работает, и может заменить 1 на подзапрос, чтобы извлечь любые данные.
Зачем это нужно злоумышленнику?
Error-based SQL-инъекции позволяют быстро получить информацию из базы данных, когда другие методы (UNION, blind) не работают или требуют много запросов. Основные цели:
- Получение версии СУБД, имени базы, пользователя.
- Извлечение таблиц и колонок из
information_schema. - Кража конфиденциальных данных: логинов, паролей, персональной информации.
Подобные строки часто автоматически генерируются инструментами вроде sqlmap при тестировании на проникновение.
Пример эксплуатации
Допустим, есть уязвимый параметр id в URL: http://site.com/page.php?id=1. Злоумышленник может подставить:
1' AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT database()), 0x7e))-- -В ответе сервера появится ошибка с именем текущей базы данных. Аналогично можно извлечь любую другую информацию.
Как защититься?
Основные меры профилактики:
- Используйте подготовленные выражения (prepared statements) с параметризацией — это самый надёжный способ.
- Применяйте ORM (например, Doctrine, Hibernate), которые автоматически экранируют данные.
- Валидируйте и фильтруйте входные данные, особенно те, что попадают в SQL-запросы.
- Ограничьте права пользователя БД: не давайте ему доступ к
information_schemaбез необходимости. - Отключите вывод подробных ошибок на продакшене — это затруднит эксплуатацию error-based инъекций.
- Регулярно обновляйте СУБД и используйте WAF для блокировки подозрительных запросов.
Что делать, если вы нашли такую строку в логах?
Если вы администратор сайта и видите подобные записи, это может означать, что ваш сайт пытаются взломать. Немедленно проверьте:
- Не уязвим ли ваш код к SQL-инъекциям (проведите аудит).
- Установлены ли обновления безопасности.
- Включите логирование и мониторинг подозрительной активности.
- Обратитесь к специалистам по информационной безопасности, если не уверены в своих силах.
Помните: даже если атака не удалась, она указывает на потенциальную уязвимость, которую нужно устранить.
Комментарии
—Войдите, чтобы оставить комментарий