Что это за строка?
Строка ') AND EXTRACTVALUE(7366,CONCAT(0x7e,((SELECT (ELT(7366=7366,1)))),0x7e))-- - представляет собой классический пример error-based SQL-инъекции (инъекции на основе ошибок) для СУБД MySQL. Такие конструкции используются злоумышленниками для извлечения данных из базы через сообщения об ошибках, которые возвращает сервер базы данных.
Внешне это выглядит как бессмысленный набор символов, но на самом деле каждый элемент здесь имеет строгое назначение. Давайте разберём его по частям.
Разбор структуры запроса
1. Начало: ')
Символы ') закрывают ранее открытую скобку и строковый литерал в уязвимом SQL-запросе. Например, если исходный запрос был SELECT * FROM users WHERE name = ('$input'), то подстановка ') разрывает строку и позволяет внедрить произвольный SQL-код.
2. Логическое условие: AND
Оператор AND присоединяет внедряемое выражение к исходному условию. Если исходный запрос возвращал какие-то строки, то добавление AND ... с истинным выражением не изменит результат, а с ложным — обнулит его. Это позволяет проводить слепые инъекции, но в данном случае используется error-based техника.
3. Функция EXTRACTVALUE(7366, CONCAT(...))
EXTRACTVALUE — это функция MySQL для работы с XML. Она принимает два аргумента: XML-документ (или его фрагмент) и XPath-выражение. Функция возвращает значение узла, соответствующего XPath. Если XPath содержит синтаксическую ошибку, MySQL генерирует ошибку XPATH syntax error, в тексте которой выводится переданное значение.
В нашем случае первый аргумент — число 7366, которое не является корректным XML-документом. Однако это не важно: злоумышленник использует функцию исключительно как генератор ошибки, чтобы вытащить результат вложенного запроса.
4. Вложенный запрос: CONCAT(0x7e, ((SELECT (ELT(7366=7366,1)))), 0x7e)
Здесь 0x7e — это шестнадцатеричное представление символа ~ (тильда). Тильда используется как маркер начала и конца извлекаемых данных, чтобы их было легко найти в сообщении об ошибке.
Внутри CONCAT выполняется подзапрос SELECT (ELT(7366=7366,1)). Функция ELT(N, str1, str2, ...) возвращает N-ю строку из списка. Выражение 7366=7366 всегда истинно (равно 1), поэтому ELT(1, 1) возвращает 1. Таким образом, вложенный запрос возвращает строку '1'.
Итоговый результат CONCAT: ~1~.
5. Комментарий: -- -
Двойной дефис с пробелом — это комментарий в MySQL. Он отсекает остаток исходного SQL-запроса, чтобы синтаксис оставался корректным. Пробел после -- обязателен, иначе MySQL воспримет это как оператор вычитания.
Как это работает целиком
Когда уязвимое приложение подставляет эту строку в SQL-запрос, база данных выполняет следующие действия:
- Закрывает исходную строку и добавляет условие
AND EXTRACTVALUE(...). - Вычисляет
CONCAT(0x7e, (SELECT (ELT(7366=7366,1))), 0x7e)→ получает~1~. - Вызывает
EXTRACTVALUE(7366, '~1~'). - Поскольку
~1~не является корректным XPath-выражением, MySQL возвращает ошибку вида:
XPATH syntax error: '~1~' - Приложение выводит эту ошибку пользователю (или в лог), и злоумышленник видит результат выполнения своего подзапроса.
В данном примере извлекается просто число 1 — это тестовая проверка уязвимости. В реальных атаках вместо ELT(7366=7366,1) подставляются запросы к системным таблицам, например:
SELECT CONCAT(0x7e, (SELECT user FROM mysql.user LIMIT 1), 0x7e)
Так злоумышленник может получить имена пользователей базы, хеши паролей, названия таблиц и другие конфиденциальные данные.
Почему это опасно?
Error-based SQL-инъекции — один из самых быстрых способов извлечения информации из базы. В отличие от слепых инъекций, где данные приходится угадывать по битам, здесь сервер сам возвращает результат в тексте ошибки. Это позволяет за считанные минуты получить структуру базы и ценные данные.
Основные риски:
- Утечка учётных данных пользователей.
- Полный доступ к базе данных.
- Возможность изменения или удаления информации.
- Компрометация всего сервера через дальнейшие атаки.
Как защититься?
Главная мера — использование параметризованных запросов (prepared statements). Они разделяют код и данные, поэтому внедрение SQL-кода становится невозможным. Дополнительно:
- Валидация и фильтрация входных данных.
- Ограничение прав пользователя базы данных (принцип наименьших привилегий).
- Отключение вывода подробных ошибок БД в продакшене.
- Регулярное обновление СУБД и фреймворков.
Если вы нашли такую строку в логах своего сайта — это признак того, что его пытаются взломать. Срочно проверьте код на наличие уязвимостей и закройте доступ к базе.
Итог
Конструкция ') AND EXTRACTVALUE(7366,CONCAT(0x7e,((SELECT (ELT(7366=7366,1)))),0x7e))-- - — это не случайный набор символов, а тщательно спроектированный инструмент для проведения error-based SQL-инъекции в MySQL. Она использует функцию EXTRACTVALUE для провоцирования ошибки, в тексте которой возвращается результат вложенного подзапроса. Понимание таких строк помогает разработчикам и специалистам по безопасности своевременно выявлять и блокировать атаки.
Комментарии
—Войдите, чтобы оставить комментарий