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

Строка ) AND EXTRACTVALUE(8798,CONCAT(0x7e,((SELECT (ELT(8798=8798,1)))),0x7e))-- - — это классический пример error-based SQL-инъекции для СУБД MySQL. Она предназначена для извлечения данных из базы через вывод сообщения об ошибке. Подобные payload'ы часто встречаются в логах веб-серверов, в полях ввода форм и в отчётах систем безопасности (WAF).

Если коротко: злоумышленник пытается заставить базу данных выполнить вредоносный SQL-код и «вытащить» через текст ошибки содержимое таблиц — например, логины, пароли, номера карт.

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

1. Закрывающая скобка )

Символ ) в начале означает, что инъекция «подстраивается» под уже существующий SQL-запрос, в котором была открытая скобка. Например, оригинальный запрос мог выглядеть так: SELECT * FROM users WHERE id = (1). Закрывая скобку, атакующий завершает исходное выражение и добавляет своё.

2. AND — логическое условие

Оператор AND присоединяет дополнительное условие к исходному запросу. Если исходный запрос возвращал true, то и весь запрос останется true, но при этом выполнится и внедрённая часть.

3. EXTRACTVALUE(8798, ...)

Функция EXTRACTVALUE() в MySQL извлекает значение из XML-строки. Она принимает два аргумента: XML-документ и XPath-выражение. Если XPath синтаксически некорректен, MySQL генерирует ошибку XPATH syntax error, в тексте которой выводится переданное значение. Именно этот механизм и используется для «слива» данных.

Первый аргумент 8798 — произвольное число, оно не играет роли, кроме как заполнитель.

4. CONCAT(0x7e, ((SELECT (ELT(8798=8798,1)))), 0x7e)

  • 0x7e — шестнадцатеричный код символа ~ (тильда). Он используется как маркер-обёртка, чтобы в сообщении об ошибке было легко найти начало и конец извлечённых данных.
  • (SELECT (ELT(8798=8798,1))) — подзапрос. ELT(N, str1, str2, ...) возвращает N-ю строку из списка. Здесь 8798=8798 — всегда истина (1), поэтому ELT(1, 1) вернёт строку '1'. Это простейший тест: если инъекция сработала, в ошибке появится ~1~.
  • CONCAT склеивает тильду, результат подзапроса и ещё одну тильду.

В реальной атаке вместо ELT(8798=8798,1) подставляют подзапросы вида (SELECT password FROM users LIMIT 1), чтобы вытащить конкретные данные.

5. Комментарий -- -

Двойной дефис с пробелом (или -- -) — это комментарий в SQL. Он «отрезает» остаток оригинального запроса, чтобы синтаксис остался корректным. В MySQL для комментария требуется пробел после --, поэтому часто пишут -- - или --+.

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

Предположим, на сайте есть страница product.php?id=1, и в коде выполняется запрос:

SELECT * FROM products WHERE id = (1)

Атакующий подставляет вместо 1 строку:

1) AND EXTRACTVALUE(8798,CONCAT(0x7e,((SELECT (ELT(8798=8798,1)))),0x7e))-- -

Итоговый запрос становится:

SELECT * FROM products WHERE id = (1) AND EXTRACTVALUE(8798,CONCAT(0x7e,((SELECT (ELT(8798=8798,1)))),0x7e))-- -)

MySQL выполнит EXTRACTVALUE, и поскольку второй аргумент не является корректным XPath, возникнет ошибка вида:

XPATH syntax error: '~1~'

Если вместо ELT(8798=8798,1) поставить подзапрос к таблице пользователей, в ошибке появятся логины и пароли.

Чем опасна error-based SQL-инъекция

Error-based инъекции — один из самых быстрых способов извлечения данных. Не нужны слепые переборы, ответ приходит сразу в тексте ошибки. Последствия:

  • утечка конфиденциальных данных (пароли, токены, персональные данные);
  • обход аутентификации;
  • изменение или удаление записей в базе;
  • в некоторых случаях — выполнение команд на сервере.

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

  1. Параметризованные запросы (prepared statements). Это главный метод. Данные передаются отдельно от SQL-кода и не могут изменить структуру запроса.
  2. Экранирование специальных символов. Если по каким-то причинам prepared statements недоступны, используйте функции экранирования (например, mysqli_real_escape_string).
  3. Валидация входных данных. Если параметр должен быть числом, приводите его к числу (intval, (int)).
  4. Отключение вывода ошибок БД. Не показывайте пользователю текст ошибок MySQL — это лишает атакующего обратной связи.
  5. WAF и мониторинг. Веб-приложения-фаерволы могут блокировать известные payload'ы, а логи помогают обнаружить попытки вторжения.
  6. Принцип наименьших привилегий. Пользователь БД для веб-приложения не должен иметь прав на DROP, FILE и доступ к системным таблицам.

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

Это признак того, что кто-то сканирует ваш сайт на уязвимости. Не паникуйте, но проверьте:

  • используются ли в коде параметризованные запросы;
  • нет ли открытых форм, где данные попадают в SQL без обработки;
  • обновлены ли CMS и библиотеки;
  • ведутся ли логи и настроен ли алертинг.

Если сайт написан на популярной CMS (WordPress, Joomla, Bitrix), убедитесь, что установлены последние версии и security-плагины.

Итог

Строка ) AND EXTRACTVALUE(8798,CONCAT(0x7e,((SELECT (ELT(8798=8798,1)))),0x7e))-- - — это учебный пример error-based SQL-инъекции. Она показывает, как через функцию EXTRACTVALUE и маркеры 0x7e злоумышленник пытается вывести данные в сообщении об ошибке. Понимание таких payload'ов помогает разработчикам и администраторам правильно выстраивать защиту: использовать prepared statements, скрывать ошибки БД и ограничивать права пользователя базы данных.

Источники