Что это за строка?

Строка '))) 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. Понимание механизма таких атак помогает разработчикам правильно защищать свои приложения. Никогда не доверяйте пользовательскому вводу и всегда используйте параметризованные запросы.

Источники