Что это за строка?
Строка %') AND EXTRACTVALUE(4681,CONCAT(0x7e,((SELECT (ELT(4681=4681,1)))),0x7e))-- - — это типичный пример SQL-инъекции (SQL injection), а именно инъекции, основанной на ошибках (error-based). Такие payload'ы встречаются в логах веб-серверов, в полях ввода форм и в параметрах URL. Их цель — заставить базу данных вернуть полезную информацию через текст ошибки или выполнить произвольный запрос.
В данном случае злоумышленник пытается проверить, уязвим ли сайт, и, если да, извлечь данные. Разберём каждый элемент.
Разбор payload по частям
1. Начало: %')
Символ % часто используется в LIKE-запросах как шаблон. Конструкция ') закрывает строковый литерал и круглую скобку в исходном SQL-запросе, после чего добавляется оператор AND. Это позволяет внедрить собственное условие в запрос.
2. Функция EXTRACTVALUE()
EXTRACTVALUE(XML_document, XPath_expression) — функция MySQL, которая извлекает значение из XML-документа по XPath-выражению. Если XPath-выражение некорректно, MySQL генерирует ошибку, содержащую результат вычисления выражения. Это ключевой механизм error-based инъекции: злоумышленник может поместить в XPath подзапрос, и его результат попадёт в текст ошибки.
3. CONCAT(0x7e, ..., 0x7e)
0x7e — шестнадцатеричное представление символа ~ (тильда). Функция CONCAT объединяет строки. Здесь она оборачивает результат подзапроса в тильды, чтобы в сообщении об ошибке было легко выделить извлечённые данные (например, версию БД или имя пользователя).
4. Подзапрос (SELECT (ELT(4681=4681,1)))
ELT(N, str1, str2, ...) возвращает строку по номеру N. Выражение 4681=4681 всегда истинно (1), поэтому ELT(1,1) вернёт 1. Это простейшая проверка: если инъекция сработает, в ошибке появится ~1~. В реальной атаке вместо 1 мог бы быть, например, version() или database().
5. Комментарий -- -
Два дефиса с пробелом и ещё одним дефисом — это комментарий в MySQL, который «отрезает» оставшуюся часть оригинального запроса, чтобы синтаксис остался корректным.
Как работает атака?
Предположим, исходный запрос выглядит так:
SELECT * FROM users WHERE name LIKE '%...%'После подстановки payload'а запрос превращается в:
SELECT * FROM users WHERE name LIKE '%') AND EXTRACTVALUE(4681,CONCAT(0x7e,((SELECT (ELT(4681=4681,1)))),0x7e))-- -%'База данных выполняет EXTRACTVALUE с некорректным XPath (строка ~1~ не является валидным XPath), что вызывает ошибку вида:
XPATH syntax error: '~1~'
Если сайт отображает ошибки БД, злоумышленник увидит этот текст и поймёт, что инъекция возможна. Далее он заменит 1 на вызовы функций, извлекая данные посимвольно.
Чем опасна error-based инъекция?
Error-based SQL-инъекции считаются одними из самых быстрых и удобных для атакующего: не нужно слепого перебора, результат приходит прямо в ответе сервера. С их помощью можно получить:
- версию СУБД и текущего пользователя;
- имена баз данных, таблиц и колонок;
- содержимое таблиц (логины, пароли, персональные данные).
В худшем случае инъекция приводит к полной компрометации базы данных.
Как защититься?
- Параметризованные запросы (prepared statements). Главная мера: никогда не конкатенировать пользовательский ввод в SQL. Используйте плейсхолдеры.
- Экранирование и валидация. Если параметризация невозможна, применяйте строгую проверку типов и экранирование спецсимволов.
- Отключение вывода ошибок БД. Не показывайте пользователям тексты ошибок СУБД — это резко снижает эффективность error-based атак.
- Принцип наименьших привилегий. Учётная запись приложения должна иметь только необходимые права.
- WAF и мониторинг. Веб-application firewall может блокировать известные payload'ы, а логи помогут заметить атаку.
Вывод
Строка %') AND EXTRACTVALUE(4681,CONCAT(0x7e,((SELECT (ELT(4681=4681,1)))),0x7e))-- - — это не случайный набор символов, а осмысленный эксплойт для проверки error-based SQL-инъекции. Если вы встретили её в логах, значит, ваш сайт пытались просканировать на уязвимость. Убедитесь, что все запросы к БД параметризованы, а сообщения об ошибках не попадают к пользователю.
Комментарии
—Войдите, чтобы оставить комментарий