Введение
Встречая в логах или в поле ввода подобную строку: ) AND EXTRACTVALUE(4795,CONCAT(0x7e,((SELECT (ELT(4795=4795,1)))),0x7e))-- -, многие задаются вопросом: что это и какова её цель? Это классический пример SQL-инъекции, нацеленной на извлечение данных через ошибки СУБД MySQL. В данной статье мы детально разберём каждую часть этого запроса, объясним, как работает error-based инъекция, и расскажем, как защититься от подобных атак.
Что такое SQL-инъекция?
SQL-инъекция (SQL injection) — это один из самых распространённых способов взлома веб-приложений, при котором злоумышленник внедряет произвольный SQL-код в запрос к базе данных. Это становится возможным, когда приложение не проверяет должным образом пользовательский ввод и передаёт его напрямую в SQL-запрос. Успешная инъекция может привести к утечке конфиденциальных данных, модификации или удалению информации, а в некоторых случаях — к полному контролю над сервером.
Существует несколько типов SQL-инъекций: union-based, error-based, blind (boolean и time-based) и другие. Рассматриваемый запрос относится к error-based инъекциям.
Разбор строки запроса
Давайте разберём строку по частям:
) AND EXTRACTVALUE(4795,CONCAT(0x7e,((SELECT (ELT(4795=4795,1)))),0x7e))-- -
- ) AND — закрывающая скобка и логический оператор AND. Злоумышленник предполагает, что исходный запрос содержит условие в скобках, и добавляет своё условие, чтобы оно выполнилось.
- EXTRACTVALUE(4795, ...) — функция MySQL, которая извлекает значение из XML-строки по указанному XPath-выражению. Первый аргумент — XML-документ (в нашем случае число 4795, которое не является валидным XML), второй — XPath. Если XPath некорректен, функция генерирует ошибку, в тексте которой может содержаться переданное значение.
- CONCAT(0x7e, ... ,0x7e) — функция конкатенации строк. 0x7e — это шестнадцатеричное представление символа «~» (тильда). Тильды используются как маркеры, чтобы облегчить поиск выводимых данных в сообщении об ошибке.
- (SELECT (ELT(4795=4795,1))) — подзапрос, возвращающий результат функции ELT. ELT(N, str1, str2, ...) возвращает N-ю строку из списка. Здесь N — это результат сравнения 4795=4795, который равен 1 (истина). Таким образом, ELT(1,1) вернёт «1». Это простейшая проверка, которая всегда возвращает 1, но в реальной атаке вместо 4795=4795 может быть условие, проверяющее данные (например, ASCII(SUBSTRING(...))=...).
- -- - — комментарий в SQL. Всё, что идёт после, игнорируется базой данных. Пробел после двух дефисов обязателен в некоторых СУБД, а третий дефис добавлен для надёжности.
Как работает error-based инъекция через EXTRACTVALUE
Основная идея error-based инъекции — заставить базу данных выдать сообщение об ошибке, которое содержит полезные данные. Функция EXTRACTVALUE в MySQL при передаче некорректного XPath-выражения возвращает ошибку вида: XPATH syntax error: '~1~'. Злоумышленник конструирует подзапрос, который возвращает интересующую его информацию (например, имя пользователя, хеш пароля), оборачивает её в CONCAT с тильдами и передаёт в EXTRACTVALUE. В результате в тексте ошибки появляется искомая строка, заключённая в тильды.
В нашем примере подзапрос возвращает просто «1», что демонстрирует работоспособность метода. В реальной атаке вместо ELT(4795=4795,1) может быть, например, ELT(1, (SELECT password FROM users LIMIT 1)) или более сложные конструкции с побитовым сравнением.
Почему это опасно?
Успешная эксплуатация такой инъекции позволяет злоумышленнику:
- Получить доступ к содержимому базы данных (логины, пароли, персональные данные).
- Изменять или удалять данные.
- Выполнять административные операции, если уязвимое приложение использует привилегированную учётную запись.
- В некоторых случаях — выполнять команды на сервере.
Error-based инъекции особенно опасны тем, что не требуют больших объёмов передаваемых данных и могут быть выполнены даже при отсутствии вывода результатов запроса на странице.
Как защититься от SQL-инъекций
Основной метод защиты — использование параметризованных запросов (prepared statements). Это гарантирует, что пользовательский ввод никогда не интерпретируется как SQL-код. Дополнительные меры:
- Валидация и фильтрация всех входных данных.
- Применение принципа наименьших привилегий для учётной записи базы данных.
- Использование ORM-библиотек, которые автоматически экранируют опасные символы.
- Регулярное обновление СУБД и веб-приложений.
- Настройка WAF (Web Application Firewall) для блокировки подозрительных запросов.
- Отключение вывода подробных сообщений об ошибках в production-среде.
Важно понимать, что даже простая фильтрация кавычек не является надёжной защитой. Только комплексный подход обеспечивает безопасность.
Заключение
Строка ) AND EXTRACTVALUE(4795,CONCAT(0x7e,((SELECT (ELT(4795=4795,1)))),0x7e))-- - — это типичный пример error-based SQL-инъекции, использующей особенности функций MySQL для извлечения данных через сообщения об ошибках. Понимание принципов работы таких атак помогает разработчикам и администраторам своевременно выявлять уязвимости и предотвращать утечки информации. Всегда используйте параметризованные запросы и следите за безопасностью ваших приложений.
Комментарии
—Войдите, чтобы оставить комментарий