Что это за строка?
Строка ' OR EXTRACTVALUE(1722,CONCAT(0x7e,((SELECT (ELT(1722=1722,1)))),0x7e))-- - представляет собой классический пример error-based SQL-инъекции (инъекции на основе ошибок) для СУБД MySQL. Такие конструкции используются злоумышленниками для извлечения данных из базы через анализ сообщений об ошибках, которые возвращает сервер.
Внешне это выглядит как попытка внедрить вредоносный код в параметр запроса, который затем попадает в SQL-запрос без должной обработки. Если приложение уязвимо, база данных выполнит этот код и вернёт ошибку, содержащую запрошенную информацию.
Как работает EXTRACTVALUE в SQL-инъекциях
Функция EXTRACTVALUE(XML_document, XPath_expression) предназначена для извлечения значения из XML-документа по заданному XPath-выражению. Однако при некорректном XPath-выражении MySQL генерирует ошибку, в тексте которой может отображаться переданный фрагмент. Это и используют атакующие.
В нашем примере:
EXTRACTVALUE(1722, ...)— первый аргумент (1722) не является корректным XML-документом, что уже провоцирует ошибку.CONCAT(0x7e, ((SELECT (ELT(1722=1722,1)))), 0x7e)— конкатенация тильды (0x7e — символ ~), результата подзапроса и ещё одной тильды. Тильды служат маркерами, чтобы облегчить поиск выводимых данных в сообщении об ошибке.SELECT (ELT(1722=1722,1))— условное выражение: если 1722=1722 (всегда истина), возвращается 1. Это простейшая проверка, но на её месте может быть любой подзапрос, например, извлечение имени пользователя, версии БД или хеша пароля.-- -— комментарий, который отсекает оставшуюся часть оригинального запроса.
Когда MySQL пытается вычислить EXTRACTVALUE с некорректным XPath, он возвращает ошибку вида: XPATH syntax error: '~1~'. Таким образом, атакующий видит результат выполнения подзапроса.
Цели и опасность error-based инъекций
Основная цель — получить данные из базы, которые не должны быть доступны. С помощью подобных конструкций злоумышленник может:
- Определить версию СУБД и тип сервера.
- Извлечь имена таблиц и колонок из
information_schema. - Получить логины, пароли, персональные данные пользователей.
- В некоторых случаях — выполнить произвольные команды на сервере (при наличии соответствующих привилегий).
Error-based инъекции особенно опасны тем, что не требуют слепого перебора: результат сразу виден в ответе сервера. Это ускоряет атаку и делает её более эффективной.
Пример эксплуатации
Рассмотрим упрощённый сценарий. Допустим, на сайте есть форма поиска, и параметр id подставляется в запрос:
SELECT * FROM articles WHERE id = '$id'
Если передать $id = ' OR EXTRACTVALUE(1722,CONCAT(0x7e,(SELECT version()),0x7e))-- -, то итоговый запрос станет:
SELECT * FROM articles WHERE id = '' OR EXTRACTVALUE(1722,CONCAT(0x7e,(SELECT version()),0x7e))-- -'
MySQL выполнит подзапрос SELECT version(), получит, например, 8.0.32, затем попытается передать это как XPath, что вызовет ошибку: XPATH syntax error: '~8.0.32~'. Атакующий увидит версию сервера.
Аналогично можно извлечь любые другие данные, подставляя вместо version() другие подзапросы.
Меры защиты
Чтобы предотвратить error-based SQL-инъекции, необходимо применять комплексный подход:
- Использование параметризованных запросов (prepared statements). Это самый надёжный способ: данные передаются отдельно от SQL-кода, и СУБД не интерпретирует их как часть запроса.
- Экранирование специальных символов. Если параметризация невозможна, следует использовать функции экранирования, предоставляемые драйвером БД (например,
mysqli_real_escape_stringв PHP). - Валидация и фильтрация входных данных. Проверяйте, что входные данные соответствуют ожидаемому формату (число, email, дата и т.п.).
- Ограничение прав пользователя БД. Приложение должно подключаться к базе с минимально необходимыми привилегиями. Не используйте root для веб-приложений.
- Отключение вывода подробных ошибок. В production-окружении не показывайте пользователям сообщения об ошибках СУБД — это лишает атакующего обратной связи.
- Использование WAF (Web Application Firewall). Современные WAF могут обнаруживать и блокировать попытки SQL-инъекций, включая конструкции с
EXTRACTVALUE. - Регулярное обновление СУБД и фреймворков. Устаревшие версии могут содержать известные уязвимости.
Заключение
Строка ' OR EXTRACTVALUE(1722,CONCAT(0x7e,((SELECT (ELT(1722=1722,1)))),0x7e))-- - — это не случайный набор символов, а тщательно сконструированная попытка эксплуатации уязвимости SQL-инъекции. Понимание принципов её работы помогает разработчикам и специалистам по безопасности лучше защищать свои приложения. Помните: безопасность — это процесс, а не одноразовое действие. Используйте параметризованные запросы, следите за обновлениями и проводите регулярные аудиты кода.
Комментарии
—Войдите, чтобы оставить комментарий