/logs?file=../../../../etc/passwdи получает содержимое системного файла.
200 OK (text/plain)
dbuser:x:1001:1001:/home/dbuser:/bin/sh
...
Эндпоинт отдаёт файл лога по имени. Атакующий подставляет ../../..
и скачивает системные файлы (например, /etc/passwd).
Фикс — нормализовать путь и запрещать выход за пределы разрешённой директории.
/logs?file=../../../../etc/passwdnew File("logs/"+fileParam)
и читает то, что получилось. Никакой проверки, куда реально указывает путь.
logs/.
Если вылезли выше — сразу 403.
Проверяем, что запрос с ../../ больше не возвращает 200 и не отдаёт системные файлы.
Ожидаем 403.
#!/bin/bash
# traversal-check.sh
STATUS=$(curl -s -o /tmp/out.txt -w "%{http_code}" \
"https://staging.example.internal/logs?file=../../../../etc/passwd")
if [ "$STATUS" = "200" ]; then
echo "[BLOCK] Directory Traversal: можно читать системные файлы"
exit 1
fi
echo "[OK] Запрещён выход за пределы logs/ (HTTP $STATUS)"
exit 0
Это гарантирует, что новый «просмотр логов» не станет окном в файловую систему.
Стандарт:никаких "отдай файл по имени, которое дал пользователь" без нормализации пути и белого списка директории.