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