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

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

В данном случае применяется функция EXTRACTVALUE(), которая извлекает значение из XML-фрагмента. Если передать в неё некорректный XPath-выражение, MySQL сгенерирует ошибку, содержащую результат вычисления вставленного подзапроса. Это позволяет атакующему получить информацию о версии базы, именах таблиц, полей и даже содержимом записей.

Как работает инъекция?

Разберём payload по частям:

  • ))) — закрывающие скобки, которые «подготавливают» точку внедрения, закрывая ранее открытые конструкции в оригинальном запросе.
  • AND — логический оператор, добавляющий условие к исходному запросу.
  • EXTRACTVALUE(1882, CONCAT(0x7e, ((SELECT (ELT(1882=1882,1)))), 0x7e)) — вызов уязвимой функции. Первый аргумент — произвольное число (1882), второй — конкатенация тильды (0x7e), результата подзапроса и ещё одной тильды.
  • -- - — комментарий, обрезающий оставшуюся часть оригинального SQL-запроса.

Внутри EXTRACTVALUE выполняется подзапрос SELECT (ELT(1882=1882,1)). Функция ELT() возвращает строку по её номеру из списка. Выражение 1882=1882 всегда истинно (1), поэтому ELT(1,1) вернёт строку '1'. Однако это лишь демонстрация; в реальной атаке вместо '1' подставляется вызов функции для извлечения данных, например @@version или SELECT password FROM users LIMIT 1.

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

Зачем нужна такая инъекция?

Error-based инъекции применяются, когда другие методы (UNION, blind) недоступны или неудобны. Например, если приложение не выводит данные напрямую, но отображает ошибки базы данных. Это позволяет быстро получить информацию:

  • Версию MySQL (SELECT @@version).
  • Имя текущей базы данных (SELECT database()).
  • Список таблиц и колонок из information_schema.
  • Конкретные данные (логины, пароли, номера карт).

Ограничение: функция EXTRACTVALUE возвращает не более 32 символов. Для получения более длинных строк используются функции SUBSTR() или LIMIT с посимвольным извлечением.

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

Предположим, есть уязвимый параметр id=1 в запросе SELECT * FROM products WHERE id = 1. Атакующий подставляет:

1 AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT @@version), 0x7e))

В ответе сервера появится ошибка с версией MySQL, например: XPATH syntax error: '~8.0.32~'. Аналогично можно извлечь и другие данные.

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

Основная мера — использование параметризованных запросов (prepared statements) и хранимых процедур. Это предотвращает внедрение вредоносного кода, так как данные не интерпретируются как SQL.

Дополнительные меры:

  • Экранирование специальных символов с помощью функций mysqli_real_escape_string() или PDO::quote().
  • Валидация и фильтрация входных данных (например, приведение к целому числу).
  • Отключение вывода ошибок базы данных в production-окружении (display_errors = off).
  • Использование WAF (веб-application firewall) для блокировки подозрительных конструкций.
  • Регулярное обновление СУБД и приложений.

Важно понимать, что error-based инъекции — лишь один из многих методов атак. Полноценная защита требует комплексного подхода и внимания к безопасности на всех уровнях.

Заключение

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

Источники