Что это за строка?

Перед нами типичный пример SQL-инъекции (SQL injection) — атаки, при которой злоумышленник внедряет вредоносный код в запрос к базе данных. Конструкция AND EXTRACTVALUE(4801,CONCAT(0x7e,((SELECT (ELT(4801=4801,1)))),0x7e))-- - предназначена для извлечения данных из базы через вызов ошибки. Это так называемая error-based SQL-инъекция, эксплуатирующая функции MySQL.

Подобные строки часто встречаются в логах веб-серверов или в полях ввода на сайтах. Если вы увидели нечто похожее, значит, кто-то пытался проверить уязвимость или получить несанкционированный доступ к информации.

Разбор по компонентам

Давайте разберём каждый элемент этого запроса.

  • AND — логический оператор, который добавляется к существующему условию SQL-запроса. Цель — изменить логику так, чтобы внедрённое выражение выполнилось.
  • EXTRACTVALUE(4801, ...) — функция MySQL, извлекающая значение из XML-фрагмента. При некорректном XML-документе она генерирует ошибку, текст которой может содержать результаты вычисления вложенного выражения. Именно это и нужно атакующему.
  • CONCAT(0x7e, ... ,0x7e) — конкатенация строк. 0x7e — шестнадцатеричный код символа ~ (тильда). Тильда используется как маркер, чтобы облегчить поиск извлечённых данных в сообщении об ошибке.
  • (SELECT (ELT(4801=4801,1))) — подзапрос, возвращающий значение. ELT() возвращает N-й элемент из списка. Выражение 4801=4801 всегда истинно, поэтому ELT(4801=4801,1) вернёт 1. Это простейшая проверка работоспособности инъекции: если ошибка появится, значит, внедрение сработало.
  • -- — начало комментария в SQL. Всё, что идёт после, игнорируется базой данных, что позволяет отбросить остаток оригинального запроса.

Таким образом, вся конструкция пытается заставить MySQL выполнить EXTRACTVALUE с заведомо некорректным XML, чтобы в тексте ошибки вернулся результат подзапроса (в данном случае — число 1, обёрнутое в тильды).

Как это работает на практике

Предположим, на сайте есть уязвимый параметр id, и запрос выглядит так:

SELECT * FROM articles WHERE id = '$id'

Если передать в $id значение 1 AND EXTRACTVALUE(4801,CONCAT(0x7e,((SELECT (ELT(4801=4801,1)))),0x7e))-- -, итоговый запрос станет:

SELECT * FROM articles WHERE id = '1 AND EXTRACTVALUE(4801,CONCAT(0x7e,((SELECT (ELT(4801=4801,1)))),0x7e))-- -'

База данных попытается вычислить EXTRACTVALUE, что приведёт к ошибке вида XPATH syntax error: '~1~'. Если сайт отображает ошибки БД, атакующий увидит этот текст и поймёт, что инъекция возможна. Далее он может заменить ELT(4801=4801,1) на подзапрос, извлекающий имена таблиц, логины, пароли и другие конфиденциальные данные.

Цель атаки

Основная цель — получить информацию из базы данных, обойдя аутентификацию. Error-based инъекции особенно опасны, потому что не требуют вывода данных напрямую: достаточно, чтобы сообщения об ошибках были видны пользователю. Злоумышленник может действовать «слепым» методом, но с ошибками это быстрее.

Конкретно данная строка с ELT(4801=4801,1) — это тестовый запрос. Он не крадёт данные, а лишь проверяет, уязвим ли сайт. Если да, последуют более сложные эксплойты.

Как защититься?

Чтобы предотвратить такие атаки, разработчикам следует:

  • Использовать параметризованные запросы (prepared statements) — они отделяют код от данных.
  • Экранировать все пользовательские входные данные с помощью функций библиотеки работы с БД (например, mysqli_real_escape_string в PHP).
  • Отключить вывод ошибок базы данных на продакшн-серверах, заменив их общими сообщениями.
  • Применять веб-файрволы (WAF) для фильтрации подозрительных конструкций.
  • Регулярно обновлять СУБД и фреймворки.

Если вы обнаружили такую строку в логах, стоит проверить код сайта на уязвимости и обратиться к специалистам по безопасности.

Вывод

Строка AND EXTRACTVALUE(4801,CONCAT(0x7e,((SELECT (ELT(4801=4801,1)))),0x7e))-- - — это не случайный набор символов, а осмысленный эксплойт для проверки SQL-инъекции. Понимание его работы помогает администраторам и разработчикам лучше защищать свои ресурсы.

Источники