Что это за строка?
Строка ") AND EXTRACTVALUE(6411,CONCAT(0x7e,((SELECT (ELT(6411=6411,1)))),0x7e))-- - — это классический пример error-based SQL-инъекции (инъекции на основе ошибок) для СУБД MySQL. Такие конструкции используют для извлечения данных из базы через анализ сообщений об ошибках, которые возвращает сервер.
Подобные запросы часто встречаются в отчётах систем обнаружения вторжений (IDS) и логах веб-серверов. Понимание их устройства помогает разработчикам и администраторам лучше защищать приложения.
Разбор по частям
Рассмотрим каждый элемент запроса:
")— попытка закрыть ранее открытую скобку и строковый литерал в уязвимом запросе, чтобы внедрить свой код.AND— логический оператор, добавляющий условие к исходному запросу.EXTRACTVALUE(6411, CONCAT(...))— функция MySQL, извлекающая значение из XML-фрагмента. При передаче некорректного XPath-выражения она генерирует ошибку, содержащую переданные данные.CONCAT(0x7e, ..., 0x7e)— объединение строк.0x7e— шестнадцатеричный код символа~(тильда), который используется как маркер для облегчения поиска извлечённых данных в сообщении об ошибке.(SELECT (ELT(6411=6411,1)))— подзапрос, возвращающий результат функцииELT().ELT(N, str1, str2, ...)возвращает строку по её номеру. Здесь условие6411=6411всегда истинно, поэтомуELTвернёт1(или строку '1'). В реальных атаках вместо всегда истинного условия подставляют логическое выражение, проверяющее данные (например,SUBSTRING(username,1,1)='a'), чтобы побайтово извлекать информацию.-- -— комментарий, обрезающий остаток исходного запроса.
Принцип работы error-based инъекции
MySQL-функция EXTRACTVALUE() при некорректном XPath-выражении возвращает ошибку вида XPATH syntax error: '~1~'. Злоумышленник может подставить в XPath результат подзапроса, и сервер вернёт его в тексте ошибки. Это позволяет извлекать произвольные данные (имена таблиц, логины, пароли) посимвольно или целыми строками, если позволяет длина сообщения.
В данном примере подзапрос возвращает предсказуемое значение 1, поэтому ошибка будет содержать ~1~. Это демонстрационный запрос, показывающий работоспособность техники. В реальной атаке вместо ELT(6411=6411,1) могла бы быть, например, ELT(6411=6411, (SELECT password FROM users LIMIT 1)).
Важно: использование подобных конструкций без разрешения владельца системы является нарушением закона и может преследоваться по статье 272 УК РФ (неправомерный доступ к компьютерной информации).
Почему это опасно?
Error-based инъекции позволяют атакующему получать данные из базы, даже если приложение не выводит результаты запросов на экран. Достаточно, чтобы сообщения об ошибках СУБД попадали в ответ сервера. Это один из самых распространённых векторов атак на веб-приложения.
По данным OWASP, SQL-инъекции входят в топ-10 критических угроз безопасности веб-приложений. Уязвимыми часто оказываются legacy-код, самописные CMS и приложения без параметризованных запросов.
Как защититься
- Параметризованные запросы (prepared statements) — лучший способ предотвратить инъекции. Они разделяют код и данные.
- Экранирование специальных символов — используйте встроенные функции драйвера БД, а не самодельные регулярные выражения.
- Отключение вывода ошибок СУБД в production — сообщения об ошибках должны логироваться, но не отображаться пользователю.
- Принцип наименьших привилегий — учётная запись приложения не должна иметь прав на чтение системных таблиц и выполнение опасных функций.
- Регулярное обновление — используйте актуальные версии СУБД и фреймворков, чтобы закрыть известные уязвимости.
- WAF (Web Application Firewall) — может блокировать известные шаблоны атак, но не заменяет исправление кода.
Заключение
Конструкция ") AND EXTRACTVALUE(6411,CONCAT(0x7e,((SELECT (ELT(6411=6411,1)))),0x7e))-- - — это учебный пример error-based SQL-инъекции для MySQL. Она демонстрирует, как злоумышленники используют особенности функций EXTRACTVALUE, CONCAT и ELT для извлечения данных через сообщения об ошибках. Разработчикам следует применять параметризованные запросы и скрывать технические детали ошибок, чтобы не стать жертвой подобных атак.
Комментарии
—Войдите, чтобы оставить комментарий