Что это за строка?
Строка ) OR EXTRACTVALUE(4895,CONCAT(0x7e,((SELECT (ELT(4895=4895,1)))),0x7e))-- - представляет собой классический пример error-based SQL-инъекции (инъекции на основе ошибок) для СУБД MySQL. Такие конструкции используются злоумышленниками для извлечения данных из базы данных путём принудительного вызова ошибки, в тексте которой возвращается запрашиваемая информация.
Подобные строки часто встречаются в логах веб-серверов, в полях ввода форм или в параметрах URL. Их цель — заставить сервер выполнить вредоносный SQL-запрос и выдать содержимое базы данных через сообщение об ошибке.
Разбор синтаксиса
Рассмотрим каждый элемент запроса подробно.
1. Закрывающая скобка )
В начале строки стоит закрывающая круглая скобка. Она нужна, чтобы «закрыть» ранее открытую скобку в оригинальном SQL-запросе, который формирует уязвимое приложение. Например, если исходный запрос выглядит как SELECT * FROM users WHERE id = (1), то подстановка ) OR ... позволяет внедрить дополнительное условие.
2. Оператор OR
Логический оператор OR используется для того, чтобы внедряемое условие было истинным независимо от исходного. Это позволяет обойти проверки и выполнить полезную нагрузку.
3. Функция EXTRACTVALUE(4895, ...)
EXTRACTVALUE — это встроенная функция MySQL, предназначенная для извлечения значения из XML-строки. Она принимает два аргумента: XML-документ и XPath-выражение. Если XPath-выражение некорректно или не соответствует структуре XML, MySQL генерирует ошибку, в тексте которой отображается переданное значение. Именно это свойство и эксплуатируется.
В нашем случае первым аргументом передаётся число 4895 — это не XML, а просто число, что уже гарантирует ошибку. Второй аргумент — сложное выражение, результат которого попадёт в сообщение об ошибке.
4. CONCAT(0x7e, ..., 0x7e)
Функция CONCAT объединяет строки. Шестнадцатеричное значение 0x7e соответствует символу тильды ~. Тильды используются как маркеры, чтобы в сообщении об ошибке легко было найти начало и конец выводимых данных. Внутри CONCAT находится подзапрос (SELECT (ELT(4895=4895,1))).
5. ELT(4895=4895,1)
ELT — функция MySQL, возвращающая N-й элемент из списка. Первый аргумент — это условие 4895=4895, которое всегда истинно (равно 1). Второй аргумент — 1. Таким образом, ELT(1,1) возвращает первый элемент списка, то есть 1. В реальных атаках вместо 1 подставляются имена таблиц, колонок или другие данные, которые нужно извлечь. Здесь приведён упрощённый пример для демонстрации.
Подзапрос (SELECT (ELT(...))) возвращает результат 1, который затем конкатенируется с тильдами. Итоговая строка ~1~ передаётся в EXTRACTVALUE, что вызывает ошибку вида: XPATH syntax error: '~1~'.
6. Комментарий -- -
Двойной дефис с пробелом или с дополнительным символом (в данном случае -- -) — это комментарий в SQL. Он «отрезает» остаток оригинального запроса, чтобы синтаксис оставался корректным. Пробел после -- обязателен в MySQL, иначе комментарий не сработает.
Как это работает на практике
Предположим, уязвимый скрипт формирует запрос:
SELECT * FROM articles WHERE id = '$_GET[id]'Если злоумышленник передаст в параметр id нашу строку, запрос примет вид:
SELECT * FROM articles WHERE id = ') OR EXTRACTVALUE(4895,CONCAT(0x7e,((SELECT (ELT(4895=4895,1)))),0x7e))-- -'СУБД выполнит его, и из-за ошибки в EXTRACTVALUE вернёт сообщение, содержащее ~1~. В реальной атаке вместо 1 могло бы быть, например, database(), user() или подзапрос, извлекающий пароли. Так злоумышленник получает данные по частям.
Чем опасны такие инъекции?
Error-based SQL-инъекции позволяют злоумышленнику:
- получить доступ к содержимому базы данных (логины, пароли, персональные данные);
- изменить или удалить информацию;
- выполнить административные операции на сервере БД;
- использовать сервер для дальнейших атак.
Особенно опасны они тем, что для извлечения данных не требуется слепое угадывание — информация возвращается напрямую в ответе сервера.
Как защититься?
Основной метод защиты — использование параметризованных запросов (prepared statements). В этом случае данные пользователя передаются отдельно от SQL-кода и не могут изменить структуру запроса. Дополнительные меры:
- экранирование специальных символов с помощью функций вроде
mysqli_real_escape_string; - валидация и фильтрация входных данных;
- ограничение прав пользователя базы данных (принцип наименьших привилегий);
- отключение вывода подробных ошибок СУБД в production-окружении;
- использование WAF (Web Application Firewall) для блокировки подозрительных запросов.
Важно: любые попытки использовать SQL-инъекции против чужих систем являются незаконными и преследуются по закону. Данная статья носит исключительно образовательный характер.
Заключение
Строка ) OR EXTRACTVALUE(4895,CONCAT(0x7e,((SELECT (ELT(4895=4895,1)))),0x7e))-- - — это типичный пример error-based SQL-инъекции, эксплуатирующей функцию EXTRACTVALUE в MySQL. Понимание таких конструкций помогает разработчикам и специалистам по безопасности распознавать атаки и своевременно защищать свои приложения.
Комментарии
—Войдите, чтобы оставить комментарий