Что это за запрос?
Строка %'))) AND EXTRACTVALUE(5998,CONCAT(0x7e,((SELECT (ELT(5998=5998,1)))),0x7e))-- - — это классический пример SQL-инъекции, нацеленной на извлечение данных из базы данных через генерацию ошибок. Подобные строки часто появляются в логах веб-сервера, когда злоумышленник пытается проникнуть на сайт. В этой статье мы разберём, что означает каждый элемент запроса, как работает атака и, главное, как от неё защититься.
Разбор составляющих запроса
EXTRACTVALUE
Функция EXTRACTVALUE в MySQL и MariaDB предназначена для извлечения значения из XML-документа. Она принимает два аргумента: XML-строку и XPath-выражение. Если XPath-выражение некорректно или возвращает не-скалярное значение, функция генерирует ошибку, в тексте которой может содержаться результат вычисления выражения. Именно это свойство и используется для проведения атаки типа error-based SQL injection.
ELT
ELT — это функция, которая возвращает N-й элемент из списка строк. Синтаксис: ELT(N, строка1, строка2, ...). В нашем случае используется ELT(5998=5998,1). Выражение 5998=5998 всегда истинно, поэтому возвращается первый элемент — строка '1'. Это нужно, чтобы гарантировать, что подзапрос вернёт конкретное значение (в данном случае '1'), которое затем будет включено в ошибку.
CONCAT и 0x7e
CONCAT объединяет строки. 0x7e — это шестнадцатеричное представление символа тильды (~). В запросе он используется как разделитель, чтобы облегчить поиск результата в тексте ошибки. Конструкция CONCAT(0x7e, (SELECT ...), 0x7e) создаёт строку вида ~результат~, которая затем передаётся в EXTRACTVALUE. Когда EXTRACTVALUE пытается обработать эту строку как XPath, она вызывает ошибку, и в сообщении об ошибке появляется наша строка с тильдами, по которой атакующий легко извлекает данные.
Комментарий -- -
Символы -- начинают комментарий в SQL, а следующий за ними пробел (или дефис) гарантирует, что комментарий будет распознан. Это позволяет отбросить оставшуюся часть исходного запроса, чтобы синтаксис стал корректным.
Как работает атака
Предположим, уязвимый запрос выглядит так: SELECT * FROM users WHERE id = '$input'. Злоумышленник подставляет нашу строку вместо $input. В результате запрос принимает вид:
SELECT * FROM users WHERE id = '%'))) AND EXTRACTVALUE(5998,CONCAT(0x7e,((SELECT (ELT(5998=5998,1)))),0x7e))-- -'Сначала закрываются кавычки и скобки, затем добавляется условие AND с вызовом EXTRACTVALUE. Внутри EXTRACTVALUE вычисляется подзапрос, который возвращает '1'. Затем CONCAT оборачивает это значение в тильды: ~1~. EXTRACTVALUE пытается интерпретировать ~1~ как XPath, терпит неудачу и выдаёт ошибку примерно такого содержания: XPATH syntax error: '~1~'. Атакующий видит эту ошибку и понимает, что инъекция работает. Далее он может заменить ELT(5998=5998,1) на любой другой подзапрос, например, (SELECT password FROM users LIMIT 1), и таким образом извлекать данные посимвольно или целыми строками, если позволяет длина сообщения об ошибке.
Зачем это нужно злоумышленнику?
Цель — получить доступ к данным, которые не должны быть видны: логины, пароли, номера кредитных карт, персональная информация. Error-based инъекции особенно удобны, когда приложение не выводит данные напрямую, но показывает сообщения об ошибках базы данных. Если ошибки подавлены, атакующий может использовать blind-техники, но EXTRACTVALUE позволяет быстро извлечь информацию через сообщения об ошибках.
Как защититься?
Лучшая защита от SQL-инъекций — использование подготовленных запросов (prepared statements) с параметризацией. Никогда не подставляйте пользовательский ввод напрямую в SQL-запрос. Также рекомендуется:
- Отключить вывод ошибок базы данных на продакшн-серверах.
- Использовать ORM или библиотеки для работы с БД, которые автоматически экранируют данные.
- Проводить валидацию и санитизацию входных данных на стороне сервера.
- Регулярно обновлять СУБД и фреймворки.
- Использовать веб-application firewall (WAF) для блокировки подозрительных запросов.
Если вы обнаружили подобную строку в логах, это сигнал о том, что ваш сайт пытались взломать. Проверьте логи на другие попытки и убедитесь, что все входные данные обрабатываются безопасно.
Вывод
Запрос с EXTRACTVALUE и ELT — это не случайный набор символов, а тщательно сконструированная SQL-инъекция для извлечения данных через ошибки. Понимание механизма помогает разработчикам и администраторам лучше защищать свои системы. Помните: безопасность — это процесс, а не разовое действие.
Комментарии
—Войдите, чтобы оставить комментарий