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

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

Подобные строки часто встречаются в отчётах пентестеров, в логах веб-серверов или в базах уязвимостей. Они не являются вредоносным кодом сами по себе, но демонстрируют, как злоумышленник может попытаться получить доступ к информации, если приложение не фильтрует входные данные.

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

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

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

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

Почему это опасно?

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

  • Получить имена таблиц и колонок.
  • Извлечь логины, пароли (в виде хешей), персональные данные пользователей.
  • Получить доступ к административным учётным записям.
  • В некоторых случаях — выполнить произвольные команды на сервере (при наличии соответствующих привилегий).

Особенно опасны такие инъекции для сайтов, где ввод пользователя напрямую подставляется в SQL-запрос без параметризации. Даже если приложение скрывает ошибки от пользователя, они могут попадать в логи, которые потом анализируются атакующими.

Пример уязвимого кода

Предположим, на сервере выполняется такой запрос (псевдокод):

$query = "SELECT * FROM users WHERE name = '" . $_GET['name'] . "'";

Если пользователь передаст в параметре name строку ') OR EXTRACTVALUE(2279,CONCAT(0x7e,((SELECT (ELT(2279=2279,1)))),0x7e))-- -, то итоговый SQL станет таким:

SELECT * FROM users WHERE name = '') OR EXTRACTVALUE(2279,CONCAT(0x7e,((SELECT (ELT(2279=2279,1)))),0x7e))-- -'

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

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

Основной способ защиты от SQL-инъекций — использование параметризованных запросов (prepared statements). В этом случае ввод пользователя передаётся отдельно от SQL-кода и не может изменить структуру запроса.

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

  • Экранирование специальных символов (например, с помощью mysqli_real_escape_string в PHP).
  • Использование ORM (Doctrine, Hibernate, Entity Framework), которые автоматически параметризуют запросы.
  • Валидация и фильтрация входных данных на стороне сервера (белые списки).
  • Отключение вывода подробных ошибок БД в production-окружении (чтобы сообщения об ошибках не попадали к пользователю).
  • Регулярное обновление СУБД и фреймворков.
  • Проведение аудитов безопасности и пентестов.

Важно понимать, что даже если приложение не выводит ошибки, злоумышленник может использовать другие техники (blind SQL injection), поэтому защита должна быть комплексной.

Заключение

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

Никогда не используйте подобные строки на чужих ресурсах без письменного разрешения — это незаконно. Данная статья носит исключительно образовательный характер.

Источники