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

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

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

Разбор конструкции по элементам

Давайте детально разберем каждый компонент этой инъекции.

1. Начальная кавычка и скобка ')

Инъекция начинается с последовательности '). Это попытка «закрыть» ранее открытую кавычку и круглую скобку в оригинальном SQL-запросе, который формируется в уязвимом приложении. Например, если исходный запрос выглядел как SELECT * FROM users WHERE name = ('$input'), то подстановка ') разрывает строковый литерал и завершает условие, позволяя внедрить собственный код.

2. Логический оператор AND

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

3. Функция EXTRACTVALUE(1628, ...)

EXTRACTVALUE — это встроенная функция MySQL, предназначенная для извлечения значения из XML-фрагмента по заданному XPath-выражению. Синтаксис: EXTRACTVALUE(XML_frag, XPath_expr). В нормальных условиях она возвращает текст, соответствующий XPath. Однако если XPath-выражение некорректно, функция генерирует ошибку. Именно на этом и строится эксплойт: злоумышленник подставляет в XPath такой текст, который вызовет ошибку, содержащую полезные данные.

В нашем случае первым аргументом указано число 1628. Это не XML-документ, а просто число, что само по себе может вызвать ошибку, но главное — второй аргумент.

4. Функция CONCAT(0x7e, ..., 0x7e)

CONCAT объединяет строки. Здесь она склеивает шестнадцатеричный код 0x7e (символ тильды ~), результат вложенного подзапроса и ещё одну тильду. Тильда используется как маркер, чтобы облегчить поиск внедрённых данных в сообщении об ошибке. Часто в error-based инъекциях применяют именно 0x7e или 0x3a (двоеточие) в качестве разделителей.

5. Вложенный подзапрос (SELECT (ELT(1628=1628,1)))

Внутри CONCAT находится подзапрос SELECT (ELT(1628=1628,1)). Функция ELT(N, str1, str2, ...) возвращает N-ю строку из списка. В данном случае условие 1628=1628 всегда истинно, поэтому ELT вернёт 1 (первый элемент списка, который также равен 1). Это простейшая проверка работоспособности инъекции: если ошибка будет содержать тильду и число 1, значит, внедрение сработало. В реальной атаке вместо ELT(1628=1628,1) мог бы стоять подзапрос, извлекающий, например, имя пользователя или хеш пароля из таблицы users.

6. Завершающая последовательность -- -

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

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

Error-based инъекция — это метод извлечения данных, при котором злоумышленник заставляет базу данных выдать сообщение об ошибке, содержащее результат выполнения подзапроса. В отличие от union-based (когда данные выводятся непосредственно в ответе приложения) или blind-based (когда данные извлекаются по косвенным признакам, например, по времени ответа), error-based полагается на то, что приложение отображает ошибки базы данных пользователю.

В нашем случае цепочка выглядит так:

  1. Приложение подставляет пользовательский ввод в SQL-запрос без должной очистки.
  2. Внедрённая строка закрывает исходный литерал и добавляет вызов EXTRACTVALUE с некорректным XPath.
  3. MySQL пытается выполнить EXTRACTVALUE, терпит неудачу и возвращает ошибку, в текст которой попадает результат CONCAT.
  4. Приложение выводит эту ошибку на страницу (или в лог, к которому есть доступ).
  5. Злоумышленник видит, например, сообщение вида XPATH syntax error: '~1~', что подтверждает успешность инъекции.

Далее, заменив ELT(1628=1628,1) на подзапрос, например (SELECT password FROM users LIMIT 1), атакующий может извлечь конфиденциальные данные посимвольно или целыми строками, в зависимости от ограничений длины сообщения об ошибке.

Чем опасна такая инъекция?

Успешная error-based SQL-инъекция может привести к:

  • Утечке данных: злоумышленник получает доступ к логинам, паролям, персональным данным пользователей, коммерческой тайне.
  • Обходу аутентификации: с помощью инъекции можно изменить логику запроса и войти в систему под чужой учётной записью.
  • Модификации или удалению данных: в некоторых случаях инъекция позволяет выполнять UPDATE или DELETE.
  • Полному захвату сервера: при наличии соответствующих привилегий возможны атаки на файловую систему или выполнение команд ОС.

Именно поэтому OWASP регулярно включает SQL-инъекции в список самых критичных уязвимостей веб-приложений.

Как защититься от error-based SQL-инъекций

Основные меры защиты универсальны для всех типов SQL-инъекций:

  • Параметризованные запросы (prepared statements) — самый надёжный способ. Они разделяют код и данные, поэтому пользовательский ввод никогда не интерпретируется как SQL-код.
  • Экранирование специальных символов — менее надёжно, но может использоваться как дополнительный слой.
  • Отключение вывода ошибок БД в production: сообщения об ошибках должны писаться в лог, недоступный пользователю. Это не устраняет уязвимость, но делает error-based инъекции неэффективными.
  • Принцип наименьших привилегий: учётная запись, от имени которой работает приложение, должна иметь доступ только к необходимым таблицам и операциям.
  • Регулярное обновление СУБД и фреймворков: исправления закрывают известные уязвимости.
  • Использование WAF (Web Application Firewall): помогает обнаруживать и блокировать типовые атаки, но не заменяет исправление кода.

Заключение

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

Источники