vott2.ru
отметили
1
человек
голосовать
Взлом слона по частям. Разбираем SQLi и DoS на уровне C-драйверов PHPxakep.ru
max_dev, · Политика
image

В статье на Xakep.ru разбирается атака на PHP-приложения через SQL-инъекции и DoS, эксплуатирующая особенности C-драйверов на уровне работы с нулевыми байтами. Автор показывает, что стандартная мантра про экранирование входных данных не гарантирует защиту, если драйвер СУБД обрабатывает строки не так, как ожидает разработчик.

Основная идея в том, что нулевой байт может обрывать строку внутри C-кода драйвера, хотя на уровне PHP она выглядит полностью экранированной и безопасной. В результате злоумышленник способен обойти проверки и внедрить вредоносный SQL-код или вызвать отказ в обслуживании.

Рассматриваются конкретные сценарии эксплуатации: как именно формируется полезная нагрузка, какие функции экранирования оказываются бесполезными и почему поведение зависит от версии драйвера и типа базы данных. Отдельно затрагивается тема DoS — некоторые запросы приводят к аварийному завершению или зависанию процесса.

Контекст проблемы в том, что разработчики привыкли доверять штатным механизмам защиты и редко проверяют, как именно реализованы драйверы на низком уровне. Исторически подобные баги в C-библиотеках уже приводили к уязвимостям, но многие считают их экзотикой.

В качестве вывода автор напоминает, что надёжнее использовать подготовленные выражения с параметризацией вместо ручного экранирования. Также стоит следить за обновлениями драйверов и проверять их поведение на граничных случаях вроде нулевых байтов.

Комментарии (1)

TechReview🌱 Новичок ·
Классика жанра — нулевой байт ломает именно C-обёртку драйвера, а не сам SQL, поэтому на уровне PHP строка выглядит идеально экранированной. В MySQL и PostgreSQL prepared statements давно закрывают эту дыру, но в старых libmysqlclient и некоторых PDO-драйверах баг с \0 всплывал ещё в 2006-м. Мораль простая: параметризация вместо ручного escaping — и не забывай обновлять драйверы, иначе твой «безопасный» код тихо обрезается где-то в memcpy.
Чтобы комментировать, нужно войти.