Что это за строка?
Строка `)) AND EXTRACTVALUE(7219,CONCAT(0x7e,((SELECT (ELT(7219=7219,1)))),0x7e))-- - — это классический пример error-based SQL-инъекции (инъекции на основе ошибок) для СУБД MySQL. Такие конструкции используются злоумышленниками для извлечения данных из базы через сообщения об ошибках, которые возвращает сервер.
Внешне это выглядит как бессмысленный набор символов, но на самом деле каждый элемент здесь имеет строгое назначение. Разберём его по частям.
Анатомия запроса
1. Закрывающие скобки `))`
Инъекция начинается с двух закрывающих круглых скобок. Они нужны, чтобы «закрыть» незавершённые конструкции в исходном SQL-запросе уязвимого приложения. Например, если оригинальный запрос выглядел как SELECT ... WHERE id = (('$input')), то подстановка `))` корректно завершает синтаксис и позволяет добавить собственное условие.
2. Оператор `AND`
Логический оператор `AND` присоединяет нашу полезную нагрузку к исходному условию. В сочетании с инъекцией это часто делается для обхода аутентификации или для вызова ошибки, только если предыдущее условие истинно.
3. Функция `EXTRACTVALUE(7219, ...)`
Функция EXTRACTVALUE(XML_document, XPath_expression) извлекает значение из XML-документа по заданному XPath-выражению. Если XPath-выражение некорректно, MySQL генерирует ошибку XPATH syntax error, в тексте которой выводится проблемный фрагмент. Именно это и нужно атакующему — сообщение об ошибке становится каналом утечки данных.
Первый аргумент — число 7219 — просто произвольный идентификатор, который не влияет на логику, но должен быть допустимым XML-документом (число подходит).
4. `CONCAT(0x7e, ..., 0x7e)`
Функция CONCAT склеивает строки. Здесь она соединяет символ `~` (шестнадцатеричный код 0x7e) с результатом подзапроса и ещё одним `~`. Тильды служат маркерами, чтобы в сообщении об ошибке было легко найти извлечённые данные — они обрамляют полезную нагрузку.
5. Подзапрос `(SELECT (ELT(7219=7219,1)))`
Внутренний подзапрос вычисляет выражение ELT(7219=7219,1). Функция ELT(N, str1, str2, ...) возвращает N-ю строку из списка. Здесь N — это результат сравнения 7219=7219, то есть истина (1). Следовательно, ELT(1,1) вернёт строку '1'. В реальной атаке вместо этого подзапроса подставляется запрос к системным таблицам, например SELECT version() или SELECT table_name FROM information_schema.tables LIMIT 1.
6. Комментарий `-- -`
Два дефиса с пробелом (или `-- -`) в MySQL означают начало комментария до конца строки. Это отсекает оставшуюся часть оригинального запроса, чтобы синтаксис оставался корректным.
Как это работает на практике
Предположим, уязвимый параметр подставляется в запрос:
SELECT * FROM users WHERE id = ('$input')
Если передать ')) AND EXTRACTVALUE(7219,CONCAT(0x7e,(SELECT version()),0x7e))-- -, то итоговый запрос примет вид:
SELECT * FROM users WHERE id = ('') AND EXTRACTVALUE(7219,CONCAT(0x7e,(SELECT version()),0x7e))-- -')
MySQL выполнит EXTRACTVALUE, попытается разобрать XPath-выражение, начинающееся с символа `~`, и выдаст ошибку вида:
XPATH syntax error: '~5.7.23~'
В этом сообщении злоумышленник увидит версию СУБД. Аналогично можно извлечь имена таблиц, столбцов, хеши паролей и любые другие данные.
Почему это опасно
- Прямая утечка данных — через ошибки можно получить содержимое базы по частям.
- Обход фильтров — error-based инъекции часто проходят там, где UNION-инъекции блокируются.
- Автоматизация — существуют инструменты (sqlmap), которые автоматически эксплуатируют такие точки входа.
Как защититься
- Параметризованные запросы (prepared statements) — главный и самый надёжный способ. Данные передаются отдельно от SQL-кода и не могут изменить структуру запроса.
- Валидация и экранирование — если параметризация невозможна, применяйте строгую проверку типов и экранирование спецсимволов.
- Отключение вывода ошибок — не показывайте пользователям детальные сообщения MySQL. Логируйте их на сервере.
- Принцип наименьших привилегий — учётная запись приложения не должна иметь прав на чтение information_schema без необходимости.
- WAF и мониторинг — веб-application firewall может отсекать известные сигнатуры, но не заменяет исправление кода.
Частные случаи и вариации
Аналогично EXTRACTVALUE для error-based инъекций используют функцию UPDATEXML. Она также генерирует XPATH-ошибку. Синтаксис похож: UPDATEXML(7219,CONCAT(0x7e,(SELECT ...),0x7e),1).
Число 7219 в нашем примере — просто случайный идентификатор, выбранный инструментом автоматизации. В других вариантах вы можете увидеть 7974, 1 или любой другой номер. Логика от этого не меняется.
Итог
Строка `)) AND EXTRACTVALUE(7219,CONCAT(0x7e,((SELECT (ELT(7219=7219,1)))),0x7e))-- - — это не случайный мусор, а тщательно сконструированная полезная нагрузка для эксплуатации уязвимости SQL-инъекции в MySQL. Она использует функцию EXTRACTVALUE для вызова ошибки, в тексте которой выводятся данные подзапроса. Понимание таких конструкций помогает разработчикам и специалистам по безопасности своевременно закрывать уязвимости и защищать базы данных.
Комментарии
—Войдите, чтобы оставить комментарий