Введение

В мире веб-безопасности SQL-инъекции остаются одной из самых распространённых и опасных уязвимостей. Среди них особое место занимают error-based SQL-инъекции, позволяющие злоумышленнику извлекать данные из базы напрямую через сообщения об ошибках. В этой статье мы детально разберём конкретную конструкцию:

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

Вы узнаете, как она работает, зачем нужна и как защититься от подобных атак.

Что такое error-based SQL-инъекция?

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

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

Разбор конструкции

Рассмотрим строку по частям:

  • ")))) — закрывающие скобки и кавычки, которые завершают оригинальный SQL-запрос, делая возможным внедрение.
  • AND EXTRACTVALUE(1631,CONCAT(0x7e,((SELECT (ELT(1631=1631,1)))),0x7e)) — вызов уязвимой функции с полезной нагрузкой.
  • -- - — комментарий, отсекающий остаток оригинального запроса.

Внутри EXTRACTVALUE используется CONCAT, который объединяет тильду (0x7e — шестнадцатеричный код символа ~), результат подзапроса и ещё одну тильду. Подзапрос (SELECT (ELT(1631=1631,1))) возвращает число 1, если условие истинно (а оно всегда истинно, так как 1631=1631). Это простейший пример, но на месте ELT может быть любое выражение, извлекающее данные из таблиц (например, версию СУБД, имена таблиц, логины и пароли).

Функция EXTRACTVALUE попытается интерпретировать строку, начинающуюся с тильды, как XML. Поскольку это не валидный XML, MySQL сгенерирует ошибку вида: XPATH syntax error: '~1~'. В этом сообщении и появится результат подзапроса.

Зачем это нужно злоумышленнику?

Цель — получить доступ к конфиденциальным данным. С помощью error-based инъекций можно:

  • Определить версию MySQL и операционную систему.
  • Получить имена баз данных, таблиц и столбцов.
  • Извлечь учётные записи пользователей, хеши паролей, персональные данные.
  • В некоторых случаях — выполнить произвольные команды на сервере.

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

Пример работы

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

SELECT * FROM users WHERE id = '1'

Злоумышленник подставляет:

1' AND EXTRACTVALUE(1631,CONCAT(0x7e,(SELECT version()),0x7e))-- -

В ответ он получит ошибку: XPATH syntax error: '~5.7.33~', из которой узнает версию MySQL.

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

Основной метод — использование параметризованных запросов (prepared statements). Они разделяют код и данные, поэтому внедрение становится невозможным. Дополнительные меры:

  • Экранирование специальных символов с помощью функций вроде mysqli_real_escape_string.
  • Валидация и фильтрация входных данных (например, приведение к целому числу).
  • Ограничение прав пользователя базы данных: не давайте приложению прав на чтение системных таблиц.
  • Отключение вывода подробных ошибок на продакшене.
  • Использование WAF (Web Application Firewall) для блокировки подозрительных запросов.

Важно понимать, что EXTRACTVALUE — не единственная функция, используемая в error-based атаках. Аналогично работают UPDATEXML, GTID_SUBSET и другие. Поэтому защита должна быть комплексной.

Заключение

Конструкция ")))) AND EXTRACTVALUE(1631,CONCAT(0x7e,...))-- - — это яркий пример error-based SQL-инъекции, эксплуатирующей особенности MySQL. Понимание принципов её работы помогает разработчикам и специалистам по безопасности своевременно выявлять и устранять уязвимости. Помните: безопасность веб-приложений — это непрерывный процесс, и использование параметризованных запросов должно стать стандартом.

Источники