Что это за строка?
Перед нами типичный пример error-based SQL-инъекции (инъекции, основанной на ошибках) для СУБД MySQL. Строка:
))) AND EXTRACTVALUE(4453,CONCAT(0x7e,((SELECT (ELT(4453=4453,1)))),0x7e))-- -
Она предназначена для внедрения в уязвимый SQL-запрос с целью вызвать ошибку базы данных, которая выведет полезную информацию. Злоумышленник использует функцию EXTRACTVALUE вместе с CONCAT и ELT, чтобы заставить MySQL сгенерировать сообщение об ошибке, содержащее результат подзапроса. В данном случае подзапрос возвращает число 1 (так как условие 4453=4453 всегда истинно), но в реальной атаке на этом месте был бы, например, логин или пароль из таблицы users.
Разбор синтаксиса
Давайте детально разберём каждый элемент конструкции.
1. Префикс )))
Три закрывающие скобки нужны для того, чтобы «закрыть» ранее открытые скобки в оригинальном запросе и выйти на уровень, где можно добавить своё условие. Злоумышленник подбирает количество скобок в зависимости от структуры уязвимого запроса. Это позволяет сделать внедрение синтаксически корректным.
2. AND EXTRACTVALUE(...)
Оператор AND добавляет наше условие к существующему WHERE или HAVING. Функция EXTRACTVALUE(XML_document, XPath_expression) в MySQL извлекает значение из XML-документа по заданному XPath-выражению. Если XPath-выражение некорректно, MySQL выдаёт ошибку, в тексте которой может содержаться переданное значение. Это и есть основа error-based инъекции.
3. CONCAT(0x7e, ((SELECT (ELT(4453=4453,1)))), 0x7e)
Функция CONCAT склеивает несколько строк. Здесь:
0x7e— шестнадцатеричное представление символа~(тильда). Он используется как разделитель, чтобы облегчить поиск выводимых данных в сообщении об ошибке.((SELECT (ELT(4453=4453,1))))— подзапрос, который возвращает результат функцииELT.ELT(N, str1, str2, ...)возвращает N-ю строку из списка. В нашем случаеELT(4453=4453, 1)— условие4453=4453истинно (равно 1), поэтомуELT(1, 1)вернёт1. Если бы условие было ложным, вернулось быNULL(но здесь всегда истина). В реальной атаке вместо1мог бы быть, например,SELECT password FROM users LIMIT 1.
Таким образом, CONCAT формирует строку вида ~1~ (или ~<секрет>~).
4. EXTRACTVALUE(4453, '~1~')
Первый аргумент 4453 — это произвольное число, которое должно быть корректным XML-документом? Фактически EXTRACTVALUE ожидает XML-строку. Число 4453 не является валидным XML, поэтому функция выдаст ошибку. Однако вторая часть — '~1~' — не является корректным XPath-выражением (начинается с тильды). MySQL сгенерирует ошибку вида:
XPATH syntax error: '~1~'
В этом сообщении и содержится искомая информация (в примере — 1). Если бы вместо 1 был пароль, он бы отобразился в ошибке.
5. Комментарий -- -
Два дефиса и пробел (или дефис) обозначают начало комментария в MySQL. Всё, что идёт после, игнорируется. Это нужно, чтобы «отрезать» оставшуюся часть оригинального запроса, которая могла бы вызвать синтаксическую ошибку. Пробел после -- обязателен в MySQL, поэтому часто пишут -- - или --+.
Цель инъекции
Основная цель — получить данные из базы данных, когда другие методы (например, UNION-based или blind) недоступны или неудобны. Error-based инъекция позволяет за один запрос извлечь произвольную строку, если приложение выводит сообщения об ошибках СУБД. В данном конкретном примере строка демонстрационная: она просто возвращает 1, чтобы проверить работоспособность инъекции. Злоумышленник сначала убеждается, что ошибка возникает и в ней отображается ~1~, а затем заменяет ELT(4453=4453,1) на подзапрос, извлекающий нужные данные (например, (SELECT username FROM users LIMIT 1)).
Как защититься?
Лучшая защита от SQL-инъекций — использование параметризованных запросов (prepared statements) и хранимых процедур. Никогда не подставляйте пользовательский ввод напрямую в SQL-запрос. Также рекомендуется:
- Отключить вывод подробных сообщений об ошибках СУБД на продакшене.
- Использовать ORM или query builder с экранированием.
- Проводить регулярные аудиты кода и пентесты.
Если вы встретили такую строку в логах, это признак попытки взлома. Следует проверить, не была ли она успешной, и обновить средства защиты (WAF, правила ModSecurity).
Заключение
Строка ))) AND EXTRACTVALUE(4453,CONCAT(0x7e,((SELECT (ELT(4453=4453,1)))),0x7e))-- - — это учебный пример error-based SQL-инъекции для MySQL. Она показывает, как злоумышленники используют функции EXTRACTVALUE, CONCAT и ELT для извлечения данных через сообщения об ошибках. Понимание этого механизма помогает разработчикам и специалистам по безопасности лучше защищать свои приложения.
Комментарии
—Войдите, чтобы оставить комментарий