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