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