Что означает запрос OR EXTRACTVALUE(7503,CONCAT(0x7e,((SELECT (ELT(7503=7503,1)))),0x7e))-- -
Эта строка — типичный пример SQL-инъекции, а точнее её разновидности, называемой error-based SQL injection (инъекция, основанная на ошибках). Она предназначена для извлечения данных из базы данных путём провоцирования ошибки, в тексте которой будут содержаться нужные злоумышленнику сведения.
Подобные конструкции часто встречаются в логах веб-серверов, в полях ввода форм или в параметрах URL. Пользователи, обнаружившие такую запись, часто задаются вопросом: что это и чем она опасна? Давайте разберём по частям.
Разбор синтаксиса
Начнём с конца: -- - — это комментарий в SQL (два дефиса, за которыми следует пробел и ещё один дефис для надёжности). Всё, что идёт после него, игнорируется базой данных. Это нужно, чтобы «отрезать» оставшуюся часть оригинального запроса, который пытается выполнить приложение.
Теперь основная часть: OR EXTRACTVALUE(7503,CONCAT(0x7e,((SELECT (ELT(7503=7503,1)))),0x7e)).
- OR — логический оператор, который добавляется к условию WHERE исходного запроса. Если исходное условие ложно, то OR с любым истинным выражением сделает всё условие истинным. Это позволяет обойти аутентификацию или изменить логику выборки.
- EXTRACTVALUE(XML_document, XPath_expression) — функция MySQL для извлечения значения из XML по XPath-выражению. Если XPath-выражение некорректно, функция выдаёт ошибку, в тексте которой отображается переданное значение. Это и используется для вывода данных.
- 7503 — произвольное число, которое будет использовано как XML-документ (фактически не важно, главное — вызвать функцию).
- CONCAT(0x7e, ..., 0x7e) — конкатенация строк. 0x7e — это шестнадцатеричное представление символа «~» (тильда). Тильда используется как маркер, чтобы в сообщении об ошибке легко найти выведенные данные.
- (SELECT (ELT(7503=7503,1))) — подзапрос, который возвращает результат выражения ELT. ELT(N, str1, str2, ...) возвращает N-ю строку из списка. Здесь N — это результат сравнения 7503=7503, то есть истина (1). ELT(1, 1) вернёт строку '1'. Таким образом, подзапрос возвращает '1'. В реальной атаке вместо этой конструкции был бы подзапрос, извлекающий, например, имя пользователя или хэш пароля.
Итог: функция EXTRACTVALUE попытается обработать XPath-выражение, начинающееся с символа «~», что вызовет ошибку вида «XPATH syntax error: '~1~'». В этом сообщении об ошибке и будут содержаться данные, которые злоумышленник пытается получить.
Зачем это нужно злоумышленнику?
Error-based инъекции — мощный инструмент, когда приложение не выводит данные напрямую, но отображает сообщения об ошибках базы данных. С помощью таких конструкций можно:
- Получить версию СУБД, имя базы данных, текущего пользователя.
- Извлечь содержимое таблиц: логины, пароли, персональные данные.
- Обойти аутентификацию, если инъекция в форме входа.
В данном конкретном примере выводится просто '1', что говорит о том, что это, скорее всего, тестовая строка для проверки уязвимости. Реальный злоумышленник заменил бы подзапрос на что-то вроде SELECT password FROM users LIMIT 1.
Пример реальной атаки
Предположим, есть уязвимый параметр id в URL: http://example.com/product?id=1. Запрос в приложении может выглядеть так:
SELECT * FROM products WHERE id = 1;
Злоумышленник подставляет:
1 OR EXTRACTVALUE(7503,CONCAT(0x7e,((SELECT (ELT(7503=7503,1)))),0x7e))-- -
В результате SQL-запрос становится:
SELECT * FROM products WHERE id = 1 OR EXTRACTVALUE(7503,CONCAT(0x7e,((SELECT (ELT(7503=7503,1)))),0x7e))-- -;
База данных выполняет EXTRACTVALUE и возвращает ошибку с текстом «~1~». Если приложение отображает эту ошибку, злоумышленник понимает, что инъекция возможна, и может продолжить извлечение данных.
Как защититься?
Основной метод защиты — использование параметризованных запросов (prepared statements). В этом случае данные никогда не интерпретируются как SQL-код, и инъекция невозможна. Дополнительные меры:
- Экранирование специальных символов с помощью функций вроде
mysqli_real_escape_string(но это менее надёжно). - Отключение вывода ошибок базы данных на продакшене (чтобы злоумышленник не видел текст ошибок).
- Использование ORM, которые по умолчанию используют параметризацию.
- Регулярное обновление СУБД и фреймворков.
- Проведение аудита кода и пентестов.
SQL-инъекции остаются в топ-10 OWASP уже много лет, и error-based инъекции — лишь одна из многих техник. Никогда не доверяйте пользовательскому вводу!
Что делать, если вы нашли такую строку в логах?
Если вы администратор и обнаружили подобную запись в логах, это признак того, что ваш сайт пытались взломать. Не паникуйте, но примите меры:
- Проверьте, не уязвим ли ваш сайт. Попробуйте ввести безобидную инъекцию в тестовой среде.
- Просмотрите код на предмет конкатенации SQL-запросов с пользовательскими данными.
- Установите WAF (Web Application Firewall), который может блокировать подобные запросы.
- Обновите CMS и плагины.
Если же вы обычный пользователь и увидели такую строку, например, в поле ввода на сайте, — это может быть результатом работы сканера уязвимостей. Не вводите её самостоятельно, если не понимаете последствий.
Заключение
Конструкция OR EXTRACTVALUE(7503,CONCAT(0x7e,((SELECT (ELT(7503=7503,1)))),0x7e))-- - — это классический пример error-based SQL-инъекции, использующей функцию EXTRACTVALUE для вывода данных через сообщение об ошибке. Она демонстрирует, насколько важно использовать параметризованные запросы и скрывать ошибки базы данных от пользователей. Понимание таких атак помогает разработчикам и администраторам лучше защищать свои системы.
Комментарии
—Войдите, чтобы оставить комментарий