Що це таке
Path Traversal (він же Directory Traversal) — вихід за межі призначеного
каталогу за допомогою ../. LFI (Local File Inclusion) — коли додаток не
просто читає, а підключає локальний файл (у PHP include/require), що
може призвести навіть до виконання коду.
Корінь проблеми той самий, що й у всіх ін'єкцій: користувацький ввід використовується як частина шляху без валідації.
Як це працює
$file = $_GET['page'];
include("/var/www/pages/" . $file);
Запит ?page=../../../../etc/passwd дає шлях
/var/www/pages/../../../../etc/passwd → /etc/passwd. Кожен ../ піднімає на
рівень вище.
Що читати в першу чергу
/etc/passwd— підтвердження вразливості (список користувачів).- Вихідний код застосунку — часто містить секрети:
../config.py,../.env,../app.py,../wp-config.php. - Знайшовши
SECRET_KEYFlask — можна підробити сесію (session forgery). - Логи,
/proc/self/environ, ключі SSH (~/.ssh/id_rsa).
Обхід фільтрів
- Кодування:
%2e%2e%2f(URL-encoded../), подвійне кодування%252e. - Нуль-байт (старі PHP):
....//або%00для обрізання розширення. - Абсолютний шлях, якщо префікс не примусовий:
/etc/passwd. - PHP-обгортки:
php://filter/convert.base64-encode/resource=index.php— вивести вихідний код у base64 (обходить виконання).
Захист
- Не будуй шляхи з вводу. Використовуй whitelist дозволених файлів (мапа
id → шлях), а не саме ім'я від користувача. - Канонізуй і перевіряй:
os.path.realpath()і переконайся, що результат всередині дозволеного каталогу. - Прибери небезпечні символи, але не покладайся лише на це (обходиться кодуванням).
- Мінімальні привілеї процесу — щоб навіть при LFI не було доступу до чутливого.
Практика: завдання LFI → Secret Key → Session Forgery — прочитай код, дістань
SECRET_KEY, підроби admin-сесію.