Что это за строка?
Строка вида %" AND EXTRACTVALUE(8107,CONCAT(0x7e,((SELECT (ELT(8107=8107,1)))),0x7e))-- - — это классический пример error-based SQL-инъекции (инъекции, основанной на ошибках) для СУБД MySQL. Такие конструкции используются злоумышленниками для извлечения данных из базы данных через сообщения об ошибках, которые возвращает сервер.
Подобные строки часто встречаются в логах веб-серверов, в полях ввода форм, в параметрах URL. Если вы увидели нечто подобное — это попытка взлома или тестирования на уязвимость.
Разбор по частям
EXTRACTVALUE
EXTRACTVALUE(XML_fragment, XPath_expression) — функция MySQL для извлечения значения из XML-фрагмента по заданному XPath-выражению. Если XPath-выражение некорректно, MySQL генерирует ошибку, в тексте которой может отображаться переданный фрагмент. Именно это и эксплуатируют хакеры.
CONCAT и 0x7e
CONCAT(0x7e, ..., 0x7e) объединяет строки. 0x7e — это шестнадцатеричный код символа ~ (тильда). Тильда используется как маркер, чтобы в сообщении об ошибке было легко найти внедрённые данные: они будут заключены между двумя тильдами.
ELT и условие 8107=8107
ELT(N, str1, str2, ...) возвращает N-ю строку из списка. В данном случае ELT(8107=8107, 1) — условие 8107=8107 всегда истинно, поэтому ELT вернёт 1. Это простейший пример; в реальных атаках вместо 1 подставляются имена таблиц, столбцов, версии СУБД и другие данные. Число 8107 — произвольное, часто генерируется случайно для уникальности.
Комментарий -- -
Двойной дефис с пробелом (-- ) или -- - — это комментарий в SQL, который отсекает оставшуюся часть оригинального запроса, чтобы инъекция не вызвала синтаксическую ошибку.
Как это работает на практике
Предположим, на сервере выполняется запрос:
SELECT * FROM articles WHERE id = 'введённые_данные';Злоумышленник подставляет вместо введённые_данные нашу строку. Запрос превращается в:
SELECT * FROM articles WHERE id = '%" AND EXTRACTVALUE(8107,CONCAT(0x7e,((SELECT (ELT(8107=8107,1)))),0x7e))-- -';MySQL пытается выполнить EXTRACTVALUE с XPath-выражением, содержащим тильды и результат подзапроса. Поскольку XPath-выражение некорректно (начинается с тильды), СУБД возвращает ошибку вида:
XPATH syntax error: '~1~'
В этом сообщении злоумышленник видит результат выполнения подзапроса. Меняя содержимое ELT или добавляя другие функции, можно извлекать произвольные данные: версию MySQL, имя текущей базы, таблицы, логины и пароли пользователей.
Зачем это нужно злоумышленнику
- Разведка: получение версии СУБД, имени базы данных, текущего пользователя.
- Извлечение данных: посимвольное чтение содержимого таблиц (например,
usersс паролями). - Обход фильтров: если прямое объединение
UNION SELECTблокируется, error-based инъекции часто проходят. - Автоматизация: существуют инструменты (sqlmap), которые автоматически эксплуатируют такие уязвимости.
Чем опасна error-based инъекция
Успешная эксплуатация приводит к полной компрометации базы данных. Злоумышленник может:
- украсть персональные данные пользователей;
- изменить или удалить информацию;
- получить доступ к административной панели;
- использовать сервер для дальнейших атак.
Даже если сайт не хранит критичных данных, через SQL-инъекцию можно получить доступ к файловой системе или выполнить команды ОС (при определённых правах).
Как защититься
- Параметризованные запросы (prepared statements). Это самый надёжный способ. Данные передаются отдельно от SQL-кода, и СУБД не интерпретирует их как часть запроса.
- Хранимые процедуры. Если они написаны корректно, риск инъекций снижается.
- Экранирование специальных символов. Например, функция
mysqli_real_escape_stringв PHP, но это менее надёжно, чем параметризация. - Валидация и фильтрация входных данных. Проверяйте типы, длины, допустимые символы. Не доверяйте данным от пользователя.
- Минимальные привилегии для пользователя БД. Веб-приложение не должно работать под root. Ограничьте права только необходимыми операциями.
- Регулярное обновление СУБД и фреймворков. Устаревшие версии могут содержать дополнительные уязвимости.
- WAF (Web Application Firewall). Помогает блокировать типовые атаки, но не заменяет правильное кодирование.
- Логирование и мониторинг. Анализируйте подозрительные запросы, чтобы вовремя обнаружить попытки взлома.
Что делать, если вы нашли такую строку в логах
Если вы администратор сайта и видите подобные записи:
- Проверьте, не была ли атака успешной (ищите необычные ошибки, изменения в БД).
- Убедитесь, что все запросы к БД используют параметризацию.
- Обновите CMS и плагины до актуальных версий.
- Проверьте права пользователя БД.
- При необходимости обратитесь к специалистам по информационной безопасности.
Помните: даже если атака не удалась, она указывает на то, что сайт сканируют. Лучше заранее закрыть уязвимости, чем разбираться с последствиями взлома.
Краткий итог
Строка с EXTRACTVALUE, CONCAT и ELT — это попытка error-based SQL-инъекции в MySQL. Она позволяет злоумышленнику извлекать данные через сообщения об ошибках. Защита строится на параметризованных запросах, ограничении прав и регулярном обновлении ПО. Если вы встретили такую строку — отнеситесь к ней как к инциденту безопасности.
Комментарии
—Войдите, чтобы оставить комментарий