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

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

В основе лежит использование функции EXTRACTVALUE вместе с CONCAT и ELT. Цель — вызвать ошибку, которая выведет на экран или в лог нужные данные. Это так называемая «error-based SQL injection» (инъекция, основанная на ошибках).

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

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

  • AND EXTRACTVALUE(6889, CONCAT(0x7e, ((SELECT (ELT(6889=6889,1)))), 0x7e)) — добавляется к легитимному SQL-запросу, чтобы изменить его логику.
  • EXTRACTVALUE(XML_document, XPath_expression) — функция MySQL, которая извлекает значение из XML-документа по XPath-выражению. Если XPath-выражение некорректно, MySQL генерирует ошибку, содержащую это выражение.
  • CONCAT(0x7e, ..., 0x7e) — объединяет строки. 0x7e — это шестнадцатеричный код символа «~» (тильда). Тильда используется как разделитель, чтобы облегчить чтение результата в сообщении об ошибке.
  • (SELECT (ELT(6889=6889,1))) — подзапрос, который возвращает значение. ELT(N, str1, str2, ...) возвращает строку по номеру. Если 6889=6889 истинно (1), то ELT(1, 1) вернёт «1». Если бы условие было ложным, вернулось бы NULL. Это простейшая проверка, часто используемая для тестирования уязвимости.
  • -- - — комментарий, который обрезает оставшуюся часть исходного запроса, чтобы синтаксис оставался корректным.

В результате выполнениz такого запроса MySQL попытается извлечь значение из несуществующего XML, что вызовет ошибку вида: «XPATH syntax error: '~1~'». В сообщении об ошибке злоумышленник увидит результат подзапроса — в данном случае «1». Меняя подзапрос, можно извлекать имена таблиц, логины, пароли и другие данные.

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

Основные цели SQL-инъекций:

  • Обход аутентификации (вход без пароля).
  • Извлечение конфиденциальных данных (учетные записи, персональные данные, номера карт).
  • Изменение или удаление информации в базе.
  • Выполнение административных операций (например, создание новых пользователей).

Конструкция с EXTRACTVALUE часто используется на этапе разведки, чтобы определить, уязвим ли сайт, и получить базовую информацию о СУБД. Если сайт уязвим, злоумышленник может перейти к более сложным атакам.

Пример работы (теоретический)

Предположим, на сайте есть форма входа, и код формирует запрос:

SELECT * FROM users WHERE login = '$login' AND password = '$password';

Если в поле login ввести ' AND EXTRACTVALUE(6889,CONCAT(0x7e,((SELECT (ELT(6889=6889,1)))),0x7e))-- -, то запрос станет:

SELECT * FROM users WHERE login = '' AND EXTRACTVALUE(6889,CONCAT(0x7e,((SELECT (ELT(6889=6889,1)))),0x7e))-- -' AND password = '...';

MySQL выполнит подзапрос, попытается извлечь XML и выдаст ошибку с результатом. Если сайт отображает ошибки БД, злоумышленник увидит «~1~» и поймет, что инъекция работает.

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

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

  • Экранировать специальные символы (хотя это не панацея).
  • Использовать ORM с безопасным построением запросов.
  • Ограничить права пользователя БД (не давать прав на чтение системных таблиц).
  • Отключить вывод ошибок БД на продакшене.
  • Регулярно обновлять СУБД и фреймворки.

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

Вывод

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

Источники