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