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

Строка AND EXTRACTVALUE(1242,CONCAT(0x7e,((SELECT (ELT(1242=1242,1)))),0x7e))-- - — это классический пример error-based SQL-инъекции (SQL-инъекция, основанная на ошибках). Она предназначена для внедрения в уязвимый SQL-запрос с целью заставить сервер базы данных вернуть содержимое, которое в обычной ситуации недоступно. В данном случае используется функция MySQL EXTRACTVALUE, чтобы вызвать ошибку, в тексте которой будут отображены результаты подзапроса.

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

Разбор по частям

Рассмотрим каждый элемент запроса подробно.

1. AND

Логический оператор, который добавляется к существующему условию WHERE. Если исходный запрос уже содержит WHERE id = 5, то внедрение AND ... позволяет выполнить дополнительное выражение. Важно, чтобы результат всего условия оставался истинным — иначе запрос не выполнится.

2. EXTRACTVALUE(1242, CONCAT(...))

EXTRACTVALUE — это функция MySQL (до версии 8.0), предназначенная для извлечения значения из XML-документа по заданному XPath-выражению. Синтаксис: EXTRACTVALUE(xml_frag, xpath_expr). Она возвращает текст узла, найденного по XPath. Если XPath-выражение некорректно или возвращает не текстовый узел, функция генерирует ошибку.

В нашем случае первый аргумент — число 1242, которое интерпретируется как XML-фрагмент. Второй аргумент — строка, получаемая через CONCAT. Если XPath-выражение начинается с символа ~ (тильда), MySQL выдаёт ошибку вида XPATH syntax error: '~...'. Именно на этом строится эксплойт: злоумышленник помещает в XPath полезные данные, и они отображаются в тексте ошибки.

3. CONCAT(0x7e, ((SELECT (ELT(1242=1242,1)))), 0x7e)

Функция CONCAT объединяет строки. Здесь она склеивает:

  • 0x7e — шестнадцатеричное представление символа ~ (тильда).
  • Результат подзапроса (SELECT (ELT(1242=1242,1))).
  • Ещё одну тильду 0x7e.

Тильды служат маркерами, чтобы в сообщении об ошибке легко было найти внедрённые данные. В данном примере подзапрос возвращает 1, но в реальной атаке на его место подставляется выражение, извлекающее имя пользователя, версию СУБД, хеши паролей и т.д.

4. ELT(1242=1242, 1)

ELT — функция MySQL, возвращающая N-й элемент из списка строк. Синтаксис: ELT(N, str1, str2, ...). Если N = 1, возвращается первая строка, и так далее. Здесь 1242=1242 — всегда истина (1), поэтому ELT(1, 1) возвращает 1. Это простейший пример, демонстрирующий работу функции. В реальных атаках вместо 1 может стоять подзапрос, например (SELECT version()).

5. -- -

Комментарий в SQL. В MySQL -- начинает комментарий до конца строки, но только если после него стоит пробел или управляющий символ. Символ - после пробела гарантирует, что комментарий будет корректно распознан. Всё, что идёт после -- -, игнорируется. Это нужно, чтобы «отрезать» остаток оригинального запроса, который мог бы помешать выполнению инъекции.

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

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

SELECT * FROM users WHERE id = 5 AND EXTRACTVALUE(1242,CONCAT(0x7e,((SELECT (ELT(1242=1242,1)))),0x7e))-- -

СУБД выполнит условие id = 5, затем вычислит EXTRACTVALUE. Второй аргумент будет строкой ~1~. Функция попытается интерпретировать её как XPath, потерпит неудачу и сгенерирует ошибку:

XPATH syntax error: '~1~'

Эта ошибка будет возвращена клиенту (если вывод ошибок не подавлен). Злоумышленник, заменив 1 на подзапрос, например (SELECT user()), получит в тексте ошибки имя текущего пользователя БД. Такой метод позволяет извлекать данные посимвольно или целыми строками, если они помещаются в сообщение об ошибке.

Почему это опасно?

Error-based SQL-инъекции — один из самых быстрых способов получить информацию из базы данных. В отличие от blind-инъекций, где приходится угадывать каждый символ по задержкам или логическим условиям, здесь данные возвращаются напрямую в ответе сервера. Это упрощает автоматизацию атак и сокращает время взлома.

Функция EXTRACTVALUE часто используется в эксплойтах, потому что она есть в старых версиях MySQL (до 8.0). В MySQL 8.0 она удалена, но остаются другие функции, например UPDATEXML. Поэтому атаки с EXTRACTVALUE всё ещё встречаются на устаревших системах.

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

Основной способ защиты от SQL-инъекций — использование параметризованных запросов (prepared statements). Это гарантирует, что пользовательский ввод никогда не будет интерпретирован как SQL-код.

Дополнительные меры:

  • Отключить вывод ошибок СУБД в production-среде. Ошибки должны логироваться, но не показываться клиенту.
  • Использовать ORM или библиотеки, которые автоматически экранируют входные данные.
  • Регулярно обновлять СУБД и применять патчи безопасности.
  • Проводить аудит кода и сканирование уязвимостей.
  • Ограничить права пользователя БД, от имени которого работает приложение: только необходимые операции.

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

Заключение

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

Источники