
Пример приложения, уязвимого к CVE-2023-32692 (внедрение правил проверки в PHP-фреймворке CodeIgniter)
CVE-2023-32692 — это уязвимость внедрения кода в PHP-фреймворке CodeIgniter 4, затрагивающая версии с 4.0.0 по 4.3.4. Она была исправлена в версии 4.3.5 (выпущенной в июне 2023 года). Это демонстрационное окружение для всех, кто хочет с ней поэкспериментировать.
Подробности об уязвимости можно найти в блоге MOGWAI LABS.
Этот репозиторий содержит минимальное приложение на CodeIgniter 4, демонстрирующее уязвимость. В него включена конфигурация Dev Container, поэтому вы можете развернуть его прямо из VS Code (или любого совместимого редактора) без необходимости локальной установки PHP.
Базовый Docker-контейнер использует PHP 8.3 и устанавливает расширение XDebug для возможности отладки. Дополнительные PHP-модули, необходимые фреймворку CodeIgniter, устанавливаются в виде локальных «функций Devcontainer» (Devcontainer features), в основном потому, что мне хотелось попробовать эту функцию.
Включены следующие расширения VS Code (все они устанавливаются внутри контейнера, а не в вашем экземпляре VS Code):
| Extension | Purpose |
|---|---|
xdebug.php-debug | Поддержка PHP XDebug — пошаговая отладка уязвимого участка кода |
bmewburn.vscode-intelephense-client | PHP Intelephense для навигации по коду |
humao.rest-client | HTTP-клиент для запуска включённых шаблонов запросов |
composer при сборке контейнера, здесь ничего делать не нужно.cp env .env
Dev Container включает Apache, но для этого PoC достаточно встроенного сервера разработки PHP. Откройте терминал в VS Code и выполните:
./spark serve --host 0.0.0.0
Приложение будет доступно по адресу http://localhost:8080. Вы можете получить к нему доступ за пределами контейнера, используя свой обычный веб-браузер.
Файл .vscode/launch.json настраивает XDebug на прослушивание TCP-порта 9003 (также указанного в Dockerfile Dev Container):
{
"version": "0.2.0",
"configurations": [
{
"name": "Listen for Xdebug",
"type": "php",
"request": "launch",
"port": 9003
}
]
}
Запустите прослушиватель отладки до запуска сервера разработки PHP: нажмите значок «Run and Debug» на боковой панели VS Code и нажмите кнопку воспроизведения рядом с «Listen for Xdebug».

Уязвимый эндпоинт реализован в app/Controllers/Poc.php. Он предоставляет два маршрута:
| Route | Description |
|---|---|
POST /poc/update | Уязвимый эндпоинт — использует строковые правила валидации |
POST /poc/updateSafe | Безопасный эндпоинт — использует правила валидации на основе массивов |
Установите точку останова в Poc::update() и проследите, как плейсхолдер {id} разворачивается в строку правил внутри механизма валидации CodeIgniter. Соответствующий код фреймворка находится в vendor/codeigniter4/framework/system/Validation/Validation.php.
Папка http_requests/ содержит готовые к использованию шаблоны для расширения VS Code REST Client:
| File | Description |
|---|---|
reqular_request.http |
Откройте любой файл .http и нажмите Send Request над блоком запроса, чтобы выполнить его.
| Базовый легитимный запрос — без инъекции, валидация проходит нормально |
basic_poc.http | Внедряет дополнительные правила валидации через параметр id |
system_call.http | Использует инъекцию для вызова system() и выполнения системной команды (touch /tmp/pwn) |