Введение

В современном мире веб-безопасности SQL-инъекции остаются одной из самых распространённых и опасных уязвимостей. Согласно OWASP Top 10, они стабильно входят в список критических рисков. Особое место среди них занимают error-based инъекции, позволяющие злоумышленнику извлекать данные через сообщения об ошибках базы данных. Одним из ярких примеров является эксплуатация функции ExtractValue в СУБД MySQL. В этой статье мы детально разберём конкретный payload: %' AND EXTRACTVALUE(5122,CONCAT(0x7e,((SELECT (ELT(5122=5122,1)))),0x7e))-- -, объясним, как он работает, и расскажем, как защититься от подобных атак.

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

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

Функция ExtractValue(XML_document, XPath_expression) извлекает значение из XML-документа по заданному XPath-выражению. Если XPath-выражение некорректно, MySQL генерирует ошибку, в которой отображается переданный фрагмент. Это и позволяет внедрять произвольные SQL-запросы в сообщение об ошибке.

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

Рассмотрим запрос %' AND EXTRACTVALUE(5122,CONCAT(0x7e,((SELECT (ELT(5122=5122,1)))),0x7e))-- - поэтапно.

  • %' — это начало payload. Символ % часто используется в LIKE-запросах, а одинарная кавычка ' закрывает строковый литерал в уязвимом параметре. Таким образом, злоумышленник «вырывается» из контекста исходного запроса.
  • AND — логический оператор, добавляющий условие к исходному запросу. Если исходный запрос был истинным, добавление AND ... с внедрённой функцией заставит базу выполнить её.
  • EXTRACTVALUE(5122, ...) — вызов функции ExtractValue. Первый аргумент — произвольное число (5122), которое не играет роли, так как XML-документ не является валидным. Второй аргумент — это XPath-выражение, которое мы конструируем с помощью CONCAT.
  • CONCAT(0x7e, ..., 0x7e) — объединяет строки. 0x7e — это шестнадцатеричное представление символа тильды (~). Тильда используется как маркер, чтобы в сообщении об ошибке было легко найти внедрённые данные. Между тильдами вставляется результат подзапроса.
  • (SELECT (ELT(5122=5122,1))) — это подзапрос, который возвращает результат функции ELT. ELT(N, str1, str2, ...) возвращает N-ю строку из списка. Здесь 5122=5122 — всегда истинное условие (1), поэтому ELT(1, 1) вернёт строку '1'. В реальной атаке вместо этого подзапроса злоумышленник подставляет запрос к системным таблицам, например, SELECT version() или SELECT table_name FROM information_schema.tables.
  • -- - — комментарий, который отсекает оставшуюся часть исходного SQL-запроса, чтобы не нарушить его синтаксис.

В результате выполнения этого payload MySQL попытается интерпретировать строку ~1~ как XPath-выражение, что вызовет ошибку вида: XPATH syntax error: '~1~'. В этом сообщении злоумышленник увидит результат выполнения подзапроса — в данном случае просто цифру 1, но в реальной атаке там могут быть любые данные.

Как эксплуатируется уязвимость

На практике атакующий действует пошагово. Сначала он проверяет наличие инъекции, подставляя простые символы, например, ' или %'. Если приложение возвращает ошибку MySQL, это уже сигнал. Затем он использует ExtractValue для извлечения информации. Например, чтобы узнать версию СУБД, payload может выглядеть так:

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

В ответе придёт ошибка с версией MySQL. Далее можно извлекать имена таблиц, столбцов, логины и пароли пользователей. Для этого часто применяются функции GROUP_CONCAT, LIMIT и другие. Error-based инъекция через ExtractValue особенно удобна, когда приложение не выводит данные напрямую, но отображает ошибки базы данных.

Опасность и последствия

Успешная эксплуатация такой уязвимости позволяет злоумышленнику:

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

По данным OWASP, SQL-инъекции приводят к утечкам миллионов записей ежегодно. Поэтому важно не только знать о существовании таких техник, но и уметь им противостоять.

Методы защиты

Чтобы предотвратить error-based SQL-инъекции через ExtractValue и подобные функции, необходимо применять комплекс мер:

  1. Использование подготовленных выражений (prepared statements). Это самый надёжный способ. Параметризованные запросы не позволяют данным интерпретироваться как SQL-код.
  2. Экранирование специальных символов. Если prepared statements недоступны, следует использовать функции экранирования, например, mysqli_real_escape_string в PHP.
  3. Валидация и фильтрация входных данных. Проверяйте типы данных, длину, допустимые символы. Не доверяйте пользовательскому вводу.
  4. Отключение вывода ошибок БД на продакшене. Сообщения об ошибках не должны попадать в ответы клиенту. Логируйте их на сервере.
  5. Принцип наименьших привилегий. Учётная запись, используемая приложением для подключения к БД, должна иметь только необходимые права. Не используйте root.
  6. Регулярное обновление СУБД и фреймворков. Уязвимости в старых версиях могут упростить эксплуатацию.
  7. Использование WAF (Web Application Firewall). Современные WAF могут обнаруживать и блокировать попытки SQL-инъекций, включая сигнатуры с ExtractValue.

Также рекомендуется проводить регулярные аудиты безопасности и пентесты, чтобы выявлять уязвимости до того, как их найдут злоумышленники.

Заключение

Payload %' AND EXTRACTVALUE(5122,CONCAT(0x7e,((SELECT (ELT(5122=5122,1)))),0x7e))-- - — это классический пример error-based SQL-инъекции через функцию ExtractValue в MySQL. Он демонстрирует, как злоумышленник может использовать ошибки базы данных для извлечения произвольной информации. Понимание механизма работы таких атак помогает разработчикам и специалистам по безопасности правильно выстраивать защиту. Помните: лучшая защита — это параметризованные запросы, строгая валидация и минимизация привилегий. Не пренебрегайте безопасностью, ведь цена ошибки может быть очень высока.

Источники