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

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

Как работает error-based SQL-инъекция?

Метод основан на том, что MySQL при определённых условиях возвращает в тексте ошибки результат выполнения подзапроса. Злоумышленник подставляет в уязвимый параметр специально сконструированную строку, и если приложение не фильтрует ввод, база данных выполняет вредоносный код и выводит данные в сообщении об ошибке.

Разбор конструкции

  • ` — обратная кавычка, закрывающая предполагаемое поле в SQL-запросе.
  • OR — логический оператор, который делает условие всегда истинным или вызывает выполнение следующей функции.
  • EXTRACTVALUE(7475, CONCAT(0x7e, ((SELECT (ELT(7475=7475,1)))), 0x7e)) — вызов XML-функции, которая при некорректном XPath-выражении генерирует ошибку. Внутри неё через CONCAT подставляется результат подзапроса.
  • 0x7e — шестнадцатеричное представление символа ~ (тильда), используется как разделитель, чтобы облегчить извлечение данных из сообщения об ошибке.
  • ELT(7475=7475,1) — функция, возвращающая первый аргумент, если условие 7475=7475 истинно. В данном случае она всегда возвращает 1 — это тестовая проверка работоспособности инъекции.
  • -- - — комментарий, который обрезает оставшуюся часть оригинального SQL-запроса.

В результате MySQL пытается выполнить EXTRACTVALUE с некорректным XPath, и в тексте ошибки возвращается значение, полученное из подзапроса. Например, ошибка может выглядеть так: XPATH syntax error: '~1~'. Если вместо 1 подставить подзапрос, извлекающий имя пользователя или хеш пароля, эти данные попадут в сообщение об ошибке.

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

Error-based инъекции позволяют получить содержимое базы данных, даже если приложение не выводит результаты запроса напрямую. Это один из самых надёжных способов извлечения информации при отсутствии возможности использовать UNION-запросы или слепые инъекции. С помощью такой техники можно получить:

  • имена таблиц и столбцов;
  • логины и пароли пользователей;
  • персональные данные клиентов;
  • служебную информацию о СУБД.

Пример эксплуатации

Допустим, уязвимый параметр — id. Злоумышленник передаёт:

1' AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT database()), 0x7e))-- -

В ответе сервера появится ошибка с именем текущей базы данных. Аналогично можно извлечь версию MySQL, имена таблиц и любые другие данные.

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

Основной способ предотвращения SQL-инъекций — использование параметризованных запросов (prepared statements). Никогда не подставляйте пользовательский ввод напрямую в SQL-запрос. Дополнительные меры:

  • валидация и фильтрация всех входных данных;
  • использование ORM или хранимых процедур;
  • ограничение прав пользователя базы данных (принцип минимальных привилегий);
  • отключение вывода подробных ошибок в production-среде;
  • регулярное обновление СУБД и веб-приложений;
  • применение WAF (Web Application Firewall).

Заключение

Строка ` OR EXTRACTVALUE(7475,CONCAT(0x7e,((SELECT (ELT(7475=7475,1)))),0x7e))-- - — это не случайный набор символов, а рабочий эксплойт для error-based SQL-инъекции в MySQL. Понимание таких конструкций помогает разработчикам и специалистам по безопасности своевременно выявлять уязвимости и защищать веб-приложения от атак.

Источники

  • SQL injection — Wikipedia