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

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

Подобные строки часто встречаются в логах веб-серверов, полях ввода форм или параметрах URL. Если вы видите такой код, это попытка атаки на веб-приложение, а не случайный набор символов.

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

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

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

Внутри EXTRACTVALUE используется CONCAT(0x7e, ..., 0x7e), где 0x7e — это шестнадцатеричное представление символа ~ (тильда). Это делается для того, чтобы отделить результат подзапроса в сообщении об ошибке.

Подзапрос (SELECT (ELT(6787=6787,1))) всегда возвращает 1, так как условие 6787=6787 истинно. Функция ELT возвращает N-й элемент из списка; здесь список состоит из одного элемента 1. Это простейший пример, но в реальной атаке вместо 1 может быть подставлен запрос к базе данных, например, для извлечения имён таблиц или паролей.

Зачем нужна ELT?

Функция ELT(N, str1, str2, ...) возвращает строку под номером N. В данном случае N — это результат сравнения 6787=6787, который равен 1 (истина). Если бы сравнение было ложным, ELT вернула бы NULL. Это позволяет атакующему управлять тем, что будет возвращено, и, соответственно, что попадёт в сообщение об ошибке.

В более сложных атаках вместо 1 может стоять подзапрос, например: ELT(1, (SELECT password FROM users LIMIT 1)). Тогда ошибка EXTRACTVALUE выдаст искомое значение.

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

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

Особенно опасны такие инъекции для сайтов на CMS (WordPress, Joomla, Bitrix) и самописных приложений, где входные параметры не фильтруются.

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

Основные меры защиты:

  1. Использование подготовленных выражений (prepared statements) с параметризацией запросов. Это самый надёжный способ, так как данные не попадают напрямую в SQL-код.
  2. Экранирование специальных символов с помощью функций вроде mysqli_real_escape_string или PDO::quote.
  3. Валидация входных данных — проверка типов, длины, допустимых символов.
  4. Отключение подробных сообщений об ошибках на продакшене, чтобы атакующий не видел текст ошибок СУБД.
  5. Использование WAF (Web Application Firewall) для блокировки подозрительных запросов.
  6. Регулярное обновление CMS и библиотек.

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

Пример безопасного кода на PHP

Вместо $query = "SELECT * FROM users WHERE id = " . $_GET['id']; используйте:

$stmt = $pdo->prepare('SELECT * FROM users WHERE id = :id');
$stmt->execute(['id' => $_GET['id']]);

Такой подход исключает возможность внедрения SQL-кода, даже если злоумышленник передаст сложную строку с EXTRACTVALUE.

Заключение

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

Источники