Что это за строка?
Строка ) 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 инъекции — один из самых быстрых способов извлечения данных. Не нужны слепые переборы, ответ приходит сразу в тексте ошибки. Последствия:
- утечка конфиденциальных данных (пароли, токены, персональные данные);
- обход аутентификации;
- изменение или удаление записей в базе;
- в некоторых случаях — выполнение команд на сервере.
Как защититься
- Параметризованные запросы (prepared statements). Это главный метод. Данные передаются отдельно от SQL-кода и не могут изменить структуру запроса.
- Экранирование специальных символов. Если по каким-то причинам prepared statements недоступны, используйте функции экранирования (например,
mysqli_real_escape_string). - Валидация входных данных. Если параметр должен быть числом, приводите его к числу (
intval,(int)). - Отключение вывода ошибок БД. Не показывайте пользователю текст ошибок MySQL — это лишает атакующего обратной связи.
- WAF и мониторинг. Веб-приложения-фаерволы могут блокировать известные payload'ы, а логи помогают обнаружить попытки вторжения.
- Принцип наименьших привилегий. Пользователь БД для веб-приложения не должен иметь прав на
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, скрывать ошибки БД и ограничивать права пользователя базы данных.
Комментарии
—Войдите, чтобы оставить комментарий