Что это за строка?
Строка )))) AND EXTRACTVALUE(2351,CONCAT(0x7e,((SELECT (ELT(2351=2351,1)))),0x7e))-- - — это классический пример error-based SQL-инъекции (инъекции на основе ошибок) для СУБД MySQL. Такие конструкции используют для извлечения данных из базы через сообщения об ошибках, которые возвращает сервер.
Подобные строки часто встречаются в логах веб-серверов, в полях ввода форм или в параметрах URL. Они выглядят как случайный набор символов, но на самом деле представляют собой тщательно сконструированный запрос, нацеленный на получение информации из базы данных.
Разбор синтаксиса
Давайте разберём каждый элемент этой инъекции:
))))— последовательность закрывающих скобок. Она нужна, чтобы «закрыть» незавершённые скобки в оригинальном SQL-запросе, который формирует уязвимое приложение. Злоумышленник предполагает, что исходный запрос содержит несколько открытых скобок, и добавляет закрывающие, чтобы синтаксис стал корректным.AND— логический оператор, который присоединяет наше условие к исходному запросу.EXTRACTVALUE(2351, CONCAT(0x7e, ((SELECT (ELT(2351=2351,1)))), 0x7e))— вызов функцииEXTRACTVALUE, которая извлекает значение из XML-фрагмента. В MySQL эта функция при получении некорректного XML-документа генерирует ошибку, содержащую переданные данные. Это и есть основа error-based инъекции.2351— произвольное число, первый аргумент функции. Оно не несёт смысловой нагрузки, но должно быть допустимым.CONCAT(0x7e, ..., 0x7e)— конкатенация символов тильды (0x7e— шестнадцатеричный код символа~) с результатом подзапроса. Тильды используются как маркеры, чтобы в сообщении об ошибке было легко найти извлечённые данные.(SELECT (ELT(2351=2351,1)))— подзапрос, который возвращает результат выраженияELT(2351=2351,1). ФункцияELTвозвращает N-й элемент из списка. Здесь2351=2351— всегда истинное условие (равенство числа самому себе), поэтомуELTвернёт первый элемент — число1. В реальной атаке вместо этого подзапроса мог бы быть, например,(SELECT version())или(SELECT password FROM users LIMIT 1).-- -— комментарий в SQL. Два дефиса и пробел (или дефис) означают, что всё, что идёт после, игнорируется. Это позволяет отсечь остаток оригинального запроса.
Как работает error-based инъекция?
MySQL-функция EXTRACTVALUE предназначена для работы с XML. Если ей передать строку, не являющуюся корректным XML, она выдаёт ошибку вида: XPATH syntax error: '~1~'. Злоумышленник может подставить в качестве второго аргумента результат подзапроса, обёрнутый в тильды. Тогда в тексте ошибки появятся извлечённые данные.
Например, если вместо ELT(2351=2351,1) подставить SELECT database(), то в ошибке отобразится имя текущей базы данных. Это позволяет пошагово извлекать структуру таблиц, имена пользователей, хэши паролей и другую конфиденциальную информацию.
Подобные техники описаны в многочисленных руководствах по SQL-инъекциям, в том числе в шпаргалках для пентестеров. Например, в «MySQL SQL Injection Practical Cheat Sheet» приводятся аналогичные примеры использования EXTRACTVALUE для извлечения данных.
Цель атаки
Основная цель — получить доступ к данным, которые не должны быть видны пользователю. Это могут быть:
- учётные данные администраторов;
- персональные данные пользователей;
- коммерческая тайна;
- структура базы данных для дальнейших атак.
Error-based инъекции особенно опасны, потому что не требуют вывода данных на страницу — достаточно, чтобы сообщение об ошибке отображалось или попадало в логи, к которым у атакующего есть доступ.
Как защититься?
Основной способ защиты от SQL-инъекций — использование параметризованных запросов (prepared statements). Они разделяют код и данные, поэтому введённые пользователем строки никогда не интерпретируются как SQL-код.
Дополнительные меры:
- экранирование специальных символов с помощью функций вроде
mysqli_real_escape_string(но это менее надёжно, чем параметризация); - ограничение прав пользователя базы данных: приложение должно работать с минимально необходимыми привилегиями;
- отключение вывода подробных ошибок на продакшене — это затрудняет error-based атаки;
- использование WAF (Web Application Firewall) для фильтрации подозрительных запросов;
- регулярное обновление СУБД и фреймворков.
Важно понимать, что EXTRACTVALUE — не единственная функция, используемая в error-based инъекциях. Аналогично работают UPDATEXML, GTID_SUBSET и другие. Поэтому защита должна быть комплексной.
Пример из реальной жизни
Предположим, на сайте есть форма поиска, которая формирует запрос:
SELECT * FROM products WHERE name LIKE '%$search%';
Если пользователь введёт ' AND EXTRACTVALUE(1,CONCAT(0x7e,(SELECT version()),0x7e))-- -, то запрос станет таким:
SELECT * FROM products WHERE name LIKE '%' AND EXTRACTVALUE(1,CONCAT(0x7e,(SELECT version()),0x7e))-- -%';
В результате MySQL выполнит подзапрос, получит версию сервера и попытается разобрать её как XML, что вызовет ошибку с текстом, содержащим версию. Если ошибки выводятся на страницу, злоумышленник увидит версию СУБД.
Заключение
Строка )))) AND EXTRACTVALUE(2351,CONCAT(0x7e,((SELECT (ELT(2351=2351,1)))),0x7e))-- - — это не случайный набор символов, а рабочий инструмент для проведения error-based SQL-инъекции в MySQL. Она демонстрирует, как с помощью встроенных функций можно заставить сервер выдать данные в сообщении об ошибке. Понимание таких атак помогает разработчикам и специалистам по безопасности правильно выстраивать защиту приложений.
Комментарии
—Войдите, чтобы оставить комментарий