Что это за строка?
Строка %') AND EXTRACTVALUE(2856,CONCAT(0x7e,((SELECT (ELT(2856=2856,1)))),0x7e))-- - — это классический пример error-based SQL-инъекции для СУБД MySQL. Она предназначена для извлечения данных из базы через вывод сообщения об ошибке. Подобные конструкции часто встречаются в логах веб-серверов и систем обнаружения вторжений (IDS/IPS), когда злоумышленник пытается проверить уязвимость сайта или получить доступ к информации.
Разбор по частям
Давайте разберём каждый элемент запроса:
%')— попытка закрыть предыдущее выражение в SQL-запросе. Символ%часто используется в LIKE-запросах, а'и)закрывают строку и скобку, чтобы внедрить свой код.AND— логический оператор, присоединяющий вредоносное условие к оригинальному запросу.EXTRACTVALUE(2856, CONCAT(0x7e, ((SELECT (ELT(2856=2856,1)))), 0x7e))— функция MySQL, которая извлекает значение из XML-документа. Если аргумент не является корректным XPath-выражением, MySQL выдаёт ошибку с текстом, содержащим переданную строку. Это позволяет атакующему «вытащить» результат подзапроса в сообщении об ошибке.0x7e— шестнадцатеричное представление символа~(тильда). Используется как разделитель, чтобы облегчить чтение выводимых данных.SELECT (ELT(2856=2856,1))— подзапрос, который возвращает число 1, если условие2856=2856истинно. ELT — функция, возвращающая N-й элемент из списка. Здесь она возвращает 1.-- -— комментарий, который заставляет СУБД игнорировать оставшуюся часть оригинального запроса.
Как это работает
Предположим, что на сервере выполняется запрос вида:
SELECT * FROM users WHERE name LIKE '%' + входные_данные + '%'
Если злоумышленник передаст в качестве входных данных строку %') AND EXTRACTVALUE(2856,CONCAT(0x7e,((SELECT (ELT(2856=2856,1)))),0x7e))-- -, то итоговый запрос станет таким:
SELECT * FROM users WHERE name LIKE '%%') AND EXTRACTVALUE(2856,CONCAT(0x7e,((SELECT (ELT(2856=2856,1)))),0x7e))-- -%'
MySQL попытается выполнить EXTRACTVALUE с аргументом, начинающимся с тильды. Так как это не валидный XPath, возникнет ошибка:
ERROR 1105 (HY000): XPATH syntax error: '~1~'
В сообщении об ошибке отобразится результат подзапроса — в данном случае 1. Если бы вместо ELT(2856=2856,1) стоял, например, SELECT password FROM users LIMIT 1, то в ошибке появился бы пароль. Так работает error-based SQL-инъекция.
Зачем это нужно злоумышленнику
Цель таких инъекций — получить доступ к данным, которые не должны быть видны. С помощью EXTRACTVALUE можно посимвольно извлекать содержимое таблиц, обходя ограничения на вывод. Это один из самых быстрых способов украсть информацию, если приложение уязвимо.
Как защититься
Основные меры защиты от SQL-инъекций:
- Использовать подготовленные выражения (prepared statements) с параметризацией запросов.
- Применять хранимые процедуры.
- Экранировать все пользовательские данные, попадающие в SQL-запрос.
- Ограничить права пользователя базы данных (не давать ему доступ к системным таблицам).
- Регулярно обновлять СУБД и использовать WAF (Web Application Firewall).
Важно понимать, что EXTRACTVALUE — не единственная функция для error-based инъекций. Аналогично используются UPDATEXML, GTID_SUBSET и другие. Однако все они бесполезны, если приложение корректно обрабатывает входные данные.
Что делать, если вы нашли такую строку в логах
Если вы обнаружили подобный запрос в логах своего сайта, это может означать, что кто-то пытался взломать ваш ресурс. Рекомендуется:
- Проверить, не уязвимо ли приложение. Используйте сканеры уязвимостей (например, SQLMap) на тестовой копии.
- Просмотреть все входные параметры, которые могли быть использованы для инъекции.
- Убедиться, что все запросы к базе данных используют параметризацию.
- Настроить оповещения о подобных попытках в системах мониторинга.
Помните: даже если атака не удалась, она указывает на интерес злоумышленников к вашему сайту. Лучше заранее закрыть уязвимости, чем потом разбираться с утечкой данных.
Комментарии
—Войдите, чтобы оставить комментарий