Что это за строка?
Строка вида ")))) AND EXTRACTVALUE(2796,CONCAT(0x7e,((SELECT (ELT(2796=2796,1)))),0x7e))-- - — это классический пример error-based SQL-инъекции для СУБД MySQL. Она предназначена для извлечения данных из базы через вывод сообщения об ошибке. Подобные конструкции часто встречаются в логах веб-серверов, в полях ввода форм, в параметрах URL и свидетельствуют о попытке взлома сайта.
Внешне строка кажется набором случайных символов, но на самом деле это тщательно сконструированный SQL-запрос, который при подстановке в уязвимое место меняет логику работы приложения и заставляет базу данных выдать скрытую информацию.
Разбор по частям
Давайте разберём каждый элемент этой инъекции.
- ")))) — закрывающие кавычки и скобки. Они нужны, чтобы «закрыть» исходный SQL-запрос приложения. Например, если разработчик написал
SELECT * FROM users WHERE name = '" + input + "', то злоумышленник подставляет строку, которая разрывает кавычки и добавляет свой код. - AND EXTRACTVALUE(2796,CONCAT(...)) — вызов функции MySQL
EXTRACTVALUE(XML_document, XPath_expression). Она извлекает значение из XML-документа по XPath-выражению. Если XPath-выражение некорректно, MySQL выдаёт ошибку, в тексте которой может содержаться переданная строка. - 2796 — произвольное число, которое в данном случае не несёт смысловой нагрузки, но может использоваться как идентификатор для подстановки.
- CONCAT(0x7e, ((SELECT (ELT(2796=2796,1)))), 0x7e) — объединение строк.
0x7e— это шестнадцатеричный код символа тильды (~). Тильда используется как маркер, чтобы в сообщении об ошибке было легко найти внедрённые данные. - ELT(2796=2796,1) — функция
ELT(N, str1, str2, ...)возвращает N-ю строку из списка. Выражение2796=2796всегда истинно и возвращает 1 (в MySQL TRUE = 1). Таким образом,ELT(1, 1)вернёт строку '1'. Это простейший тест: если инъекция сработала, в ошибке появится '~1~'. - -- - — комментарий. В MySQL
--начинает комментарий до конца строки, а пробел после двух дефисов обязателен. Дефис в конце — для обхода некоторых парсеров.
Как работает error-based инъекция
MySQL при вызове EXTRACTVALUE с некорректным XPath-выражением генерирует ошибку вида:
XPATH syntax error: '~1~'
Злоумышленник может подставить вместо ELT(2796=2796,1) любой другой SQL-запрос, например (SELECT password FROM users LIMIT 1). Тогда в сообщении об ошибке отобразится пароль первого пользователя. Именно так работает извлечение данных через ошибки.
Подобные техники появились потому, что часто приложение не выводит результаты запроса на экран, но выводит сообщения об ошибках базы данных. Это и становится каналом утечки.
Зачем нужны 0x7e и ELT?
Символ тильды (0x7e) служит маркером начала и конца извлекаемых данных. Без него в длинном тексте ошибки было бы сложно найти нужный фрагмент. ELT с тождественным сравнением — это «нулевая» проверка: если сервер возвращает '~1~', значит, инъекция возможна и можно переходить к извлечению реальных данных.
Число 2796 в данном примере — просто случайный идентификатор, который может меняться в разных атаках. Он не влияет на логику, но иногда используется для обхода сигнатур WAF (Web Application Firewall).
Где встречается такая строка
Подобные конструкции можно обнаружить:
- в логах веб-сервера (access.log, error.log);
- в логах WAF или систем обнаружения вторжений;
- в параметрах URL, если сайт уязвим и кто-то пытается его просканировать;
- в полях форм обратной связи, поиска, авторизации.
Если вы увидели такую строку в своих логах — это не обязательно успешная атака, но повод проверить безопасность приложения.
Как защититься от SQL-инъекций
Основной способ защиты — использовать параметризованные запросы (prepared statements). В этом случае данные передаются отдельно от SQL-кода, и внедрить произвольный запрос невозможно.
Дополнительные меры:
- Экранирование специальных символов (например, функция
mysqli_real_escape_stringв PHP). - Валидация и фильтрация входных данных по белому списку.
- Отключение вывода подробных ошибок базы данных на продакшене.
- Использование ORM и современных фреймворков, которые по умолчанию применяют параметризацию.
- Регулярное обновление СУБД и веб-приложения.
- Установка WAF для блокировки типовых атак.
Важно понимать: даже если конкретная строка с EXTRACTVALUE не сработает, злоумышленник может использовать другие функции, например UPDATEXML или GTID_SUBSET. Поэтому защита должна быть комплексной.
Вывод
Строка ")))) AND EXTRACTVALUE(2796,CONCAT(0x7e,((SELECT (ELT(2796=2796,1)))),0x7e))-- - — это не случайный набор символов, а целенаправленная попытка эксплуатации уязвимости SQL-инъекции в MySQL. Она использует функцию EXTRACTVALUE для вывода данных через сообщение об ошибке. Понимание таких конструкций помогает администраторам и разработчикам своевременно обнаруживать атаки и закрывать уязвимости.
Если вы нашли подобную строку в логах, рекомендуется немедленно провести аудит кода на предмет использования небезопасных SQL-запросов и внедрить параметризацию.
Комментарии
—Войдите, чтобы оставить комментарий