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

Строка ) AND EXTRACTVALUE(4543,CONCAT(0x7e,((SELECT (ELT(4543=4543,1)))),0x7e))-- - представляет собой классический пример error-based SQL-инъекции (инъекции на основе ошибок) для СУБД MySQL. Такие конструкции используются злоумышленниками для извлечения данных из базы данных через вызов ошибок, содержащих результат выполнения вложенного запроса. В данном случае внедряемый код пытается заставить сервер вывести информацию через сообщение об ошибке, которое затем анализируется атакующим.

Разбор по частям

Закрывающая скобка и логическое условие

Начинается строка с символа ). Это попытка закрыть ранее открытую скобку в оригинальном SQL-запросе, чтобы внедрить собственный код. Далее следует AND — логический оператор, который добавляет условие к существующему запросу. Если исходный запрос был, например, SELECT * FROM products WHERE id = (1), то после подстановки пользовательского ввода может получиться SELECT * FROM products WHERE id = (1) AND EXTRACTVALUE(...). Таким образом, инъекция выполняется, только если первая часть условия истинна (или в зависимости от логики запроса).

Функция EXTRACTVALUE

EXTRACTVALUE(XML_frag, XPath_expr) — встроенная функция MySQL, которая извлекает значение из фрагмента XML по заданному XPath-выражению. Однако при некорректном использовании (например, если XPath-выражение содержит недопустимые символы) она генерирует ошибку, текст которой включает переданные данные. Это и эксплуатируют злоумышленники: они передают в функцию такой XPath, который вызывает ошибку с внедрённой информацией.

Первый аргумент: 4543

Число 4543 — это произвольный числовой литерал, который служит первым аргументом для EXTRACTVALUE. Фактически он не несёт смысловой нагрузки, кроме как быть валидным XML-фрагментом (число интерпретируется как текст).

Второй аргумент: CONCAT и вложенный запрос

Второй аргумент — это CONCAT(0x7e,((SELECT (ELT(4543=4543,1)))),0x7e). Функция CONCAT объединяет строки. 0x7e — шестнадцатеричное представление символа ~ (тильда). Тильда используется как маркер, чтобы облегчить извлечение данных из сообщения об ошибке: всё, что находится между двумя тильдами, и есть результат подзапроса. Вложенный запрос (SELECT (ELT(4543=4543,1))) — это конструкция, которая возвращает 1, если условие 4543=4543 истинно (а оно всегда истинно), и NULL в противном случае. Функция ELT(N, str1, str2, ...) возвращает N-ю строку из списка. Здесь список состоит из одного элемента 1, поэтому возвращается 1. Таким образом, вложенный запрос возвращает строку '1'.

Итоговый XPath-аргумент выглядит так: ~1~. При передаче в EXTRACTVALUE MySQL пытается интерпретировать ~1~ как XPath-выражение. Символ ~ не является допустимым началом XPath, поэтому возникает ошибка вида XPATH syntax error: '~1~'. В реальной атаке вместо ELT(4543=4543,1) мог бы быть подзапрос, извлекающий, например, имя пользователя или хеш пароля. Тогда ошибка содержала бы эти данные, и атакующий мог бы их прочитать.

Комментарий в конце

-- - — это комментарий в SQL (два дефиса, за которыми следует пробел или другой символ, чтобы гарантировать корректное распознавание). Он отсекает оставшуюся часть оригинального запроса, чтобы синтаксис стал валидным.

Зачем это нужно злоумышленнику?

Error-based SQL-инъекции позволяют извлекать данные по одному биту за запрос, вызывая ошибки с внедрённой информацией. Это медленнее, чем UNION-based инъекции, но работает, когда приложение не выводит результаты запроса напрямую, а только сообщения об ошибках. Конструкция с EXTRACTVALUE и CONCAT — один из самых распространённых приёмов для MySQL.

Как защититься?

  • Используйте параметризованные запросы (prepared statements) — они предотвращают внедрение кода.
  • Экранируйте пользовательский ввод, но помните, что это не панацея.
  • Ограничьте права пользователя базы данных, чтобы даже при инъекции нельзя было прочитать лишние данные.
  • Отключите вывод подробных ошибок в production-окружении.
  • Регулярно проводите аудит кода и используйте сканеры уязвимостей.
Важно: данная статья носит образовательный характер. Использование описанных техник без разрешения владельца системы является незаконным.

Источники