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

Строка %') 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 и другие. Однако все они бесполезны, если приложение корректно обрабатывает входные данные.

Что делать, если вы нашли такую строку в логах

Если вы обнаружили подобный запрос в логах своего сайта, это может означать, что кто-то пытался взломать ваш ресурс. Рекомендуется:

  1. Проверить, не уязвимо ли приложение. Используйте сканеры уязвимостей (например, SQLMap) на тестовой копии.
  2. Просмотреть все входные параметры, которые могли быть использованы для инъекции.
  3. Убедиться, что все запросы к базе данных используют параметризацию.
  4. Настроить оповещения о подобных попытках в системах мониторинга.

Помните: даже если атака не удалась, она указывает на интерес злоумышленников к вашему сайту. Лучше заранее закрыть уязвимости, чем потом разбираться с утечкой данных.

Источники