Перейти к содержимому

Поиск по платформе

LFI через PHP stream wrappers (php://filter)

Наивная фильтрация ../ не блокирует php://filter — атакующий читает исходники PHP-файлов в base64.

Автор: Hack & Fix
Освоишь: allowlist путейbasename-onlydisable dynamic include
Средне+60 XP ~32 мин php
CWE-98 · A03:2021 Pro
Обложка: LFI через PHP stream wrappers (php://filter) Обложка: LFI через PHP stream wrappers (php://filter)
Задача
# Локальное включение файлов (обход фильтра через stream wrappers) ## Сценарий Вы проводите аудит **СофтБерг** — магазина программного обеспечения и лицензий на нативном PHP. У магазина есть раздел «Документация»: статьи лежат отдельными файлами, а точка просмотра открывает нужную по имени из запроса. Разработчик начитался статей о path traversal, заблокировал в имени переходы к родительскому каталогу и потребовал конкретный суффикс файла — и закрыл задачу как решённую. Перед релизом лицензионного портала вас попросили проверить эту защиту: известно, что кроме обычных путей PHP понимает и другие способы адресации файлов. ## Цель 1. Изучите раздел документации: какие значения проходят проверки, какие блокируются и чем оправдана каждая проверка. 2. Найдите значение, которое проходит фильтр, но заставляет механизм подключения вернуть содержимое произвольного читаемого файла — в том числе исходный код приложения. 3. По исходникам определите, откуда приложение берёт флаг, и извлеките его тем же механизмом. ## Теория Механизмы подключения файлов в PHP адресуют не только пути файловой системы: интерпретатор понимает встроенные схемы-обёртки потоков. Одна из них умеет прогонять содержимое любого читаемого файла через встроенные конвертеры — например, бинарно-безопасное кодирование. Закодированное содержимое перестаёт быть исполняемым кодом, но попадает в вывод страницы: атакующий читает исходники. Чёрный список «подозрительных» символов против этого бессилен: значение со схемой-обёрткой в начале не содержит заблокированных последовательностей и проходит проверки наравне с обычным именем. **Уязвимый паттерн:** ```php // Блокируются лишь «..» и суффикс проверяется: if (str_contains($name, '..')) { /* отказ */ } // ...значение с префиксом схемы всё равно уходит в подключение: @include($name); ``` ## Точка входа атаки `GET /doc` — просмотр статей документации; имя передаётся параметром `name`. * **Легитимные статьи:** значения вроде `index.php`, `api.php`, `faq.php` * **Обычный пользователь (для знакомства с магазином):** `demo` / `demo` — сам эндпоинт публичен * **Признак успеха:** в ответе — закодированный блок с исходным кодом серверных файлов

Похожие лабораторные (2)

другие лабы по этой уязвимости
Обложка лабы: Local File Inclusion через include() Обложка лабы: Local File Inclusion через include()
File Incl

Local File Inclusion через include()

Параметр file передаётся напрямую в include() без валидации — атакующий читает произвольные файлы сервера.

+30 XP
PHP Pro
Exploit Fix
Обложка лабы: Remote File Inclusion через include() с allow_url_include Обложка лабы: Remote File Inclusion через include() с allow_url_include
File Incl

Remote File Inclusion через include() с allow_url_include

Параметр page передаётся в include() при включённом allow_url_include — атакующий загружает и выполняет произвольный PHP-код с удалённого сервера.

+90 XP
PHP Pro
Exploit Fix