Введение
Строка ") AND EXTRACTVALUE(2413,CONCAT(0x7e,((SELECT (ELT(2413=2413,1)))),0x7e))-- - представляет собой фрагмент, который может быть частью SQL-запроса, внедрённого злоумышленником. Это типичный пример error-based SQL-инъекции (инъекции, основанной на ошибках) для системы управления базами данных MySQL. В данной статье мы разберём, что означает каждый элемент этой конструкции, как она работает и почему считается опасной.
Что такое error-based SQL-инъекция?
SQL-инъекция — это атака, при которой злоумышленник внедряет в запрос к базе данных произвольный SQL-код. При error-based инъекции атакующий заставляет сервер базы данных выдать сообщение об ошибке, содержащее полезные данные (например, имена таблиц, версию СУБД или конкретные значения). Это возможно, когда приложение выводит ошибки базы данных пользователю.
В нашем случае используется функция EXTRACTVALUE(), которая в MySQL предназначена для извлечения значения из XML-документа. Однако при передаче некорректного XPath-выражения она генерирует ошибку, текст которой может включать переданные данные.
Разбор конструкции по частям
1. Закрывающая кавычка и скобка: ")
Символы ") используются для «выхода» из исходного строкового литерала и закрытия скобки в оригинальном запросе. Например, если уязвимый запрос выглядит как SELECT * FROM users WHERE name = "$input", то подстановка ") может сделать условие синтаксически корректным для дальнейшего внедрения.
2. Оператор AND
Логический оператор AND добавляет дополнительное условие к запросу. В контексте инъекции он позволяет присоединить вызов опасной функции, не нарушая синтаксис.
3. Функция EXTRACTVALUE(2413, CONCAT(...))
EXTRACTVALUE(XML_target, XPath_expr) — встроенная функция MySQL, которая извлекает фрагмент XML. Если второй аргумент не является корректным XPath-выражением, MySQL возвращает ошибку вида XPATH syntax error: '...'. В сообщении об ошибке отображается часть переданного XPath-выражения. Это и есть канал утечки данных.
Первый аргумент 2413 — произвольное число, которое не влияет на результат, но должно быть допустимым XML-фрагментом (число интерпретируется как текст).
4. CONCAT(0x7e, ((SELECT ...)), 0x7e)
Функция CONCAT объединяет строки. Здесь 0x7e — шестнадцатеричное представление символа ~ (тильда). Тильда используется как маркер, чтобы в сообщении об ошибке было легко найти внедрённые данные. Внутри CONCAT находится подзапрос (SELECT (ELT(2413=2413,1))).
5. SELECT (ELT(2413=2413,1))
ELT(N, str1, str2, ...) возвращает N-ю строку из списка. В данном случае 2413=2413 всегда истинно (1), поэтому ELT(1, 1) возвращает 1. Это простейшая проверка, которая может быть заменена на любой другой подзапрос для извлечения реальных данных, например (SELECT password FROM users LIMIT 1).
Таким образом, в текущем виде конструкция просто возвращает строку ~1~ и вызывает ошибку XPath, в тексте которой появится ~1~. Злоумышленник, увидев эту ошибку, может заменить ELT(...) на подзапрос, возвращающий конфиденциальные сведения.
6. Комментарий -- -
Два дефиса с пробелом (или -- -) начинают комментарий в MySQL, который игнорирует оставшуюся часть исходного запроса. Это позволяет отбросить лишние кавычки или условия, которые могли бы помешать выполнению инъекции.
Как это работает на практике
Предположим, уязвимое приложение выполняет запрос:
SELECT * FROM articles WHERE id = '") AND EXTRACTVALUE(2413,CONCAT(0x7e,((SELECT (ELT(2413=2413,1)))),0x7e))-- -'После подстановки запрос примет вид:
SELECT * FROM articles WHERE id = '") AND EXTRACTVALUE(2413,CONCAT(0x7e,((SELECT (ELT(2413=2413,1)))),0x7e))-- -'MySQL выполнит условие id = '") (скорее всего, ложное), затем вычислит EXTRACTVALUE. Так как второй аргумент содержит символы, недопустимые в XPath (например, ~), возникнет ошибка. Если приложение выводит ошибки БД, пользователь увидит сообщение вроде:
XPATH syntax error: '~1~'
Это подтверждает, что инъекция сработала. Затем атакующий может заменить ELT(2413=2413,1) на подзапрос, например (SELECT version()), и получить версию СУБД в сообщении об ошибке.
Меры защиты
- Параметризованные запросы (prepared statements) — самый надёжный способ предотвратить SQL-инъекции. Никогда не подставляйте пользовательский ввод напрямую в SQL-код.
- Экранирование специальных символов — используйте функции экранирования, предоставляемые драйвером БД (например,
mysqli_real_escape_stringв PHP). - Отключение вывода ошибок БД — не показывайте пользователям сообщения об ошибках базы данных. Записывайте их в лог, а пользователю выдавайте общую страницу ошибки.
- Принцип наименьших привилегий — учётная запись, от имени которой работает приложение, должна иметь только необходимые права (обычно только SELECT, INSERT, UPDATE, DELETE для конкретных таблиц).
- Регулярное обновление СУБД — используйте актуальные версии MySQL, в которых исправлены известные уязвимости.
Заключение
Конструкция ") AND EXTRACTVALUE(2413,CONCAT(0x7e,((SELECT (ELT(2413=2413,1)))),0x7e))-- - — это учебный пример error-based SQL-инъекции, демонстрирующий, как злоумышленники могут извлекать данные через сообщения об ошибках. Понимание таких техник необходимо для разработчиков и специалистов по безопасности, чтобы своевременно защищать веб-приложения. Помните: безопасность баз данных — это не только настройка сервера, но и грамотное написание кода.
Комментарии
—Войдите, чтобы оставить комментарий