Райтап на задачу «Просмотр файлов»

Автор:

feadal

25 октября 2026
Просмотр файлов
Категория:

Web

Задача «Просмотр файлов»

Автор:

LastTeamLead

Первая кровь:
4500zenja
Сложность:
easy
Дата публикации:
30.09.2025
Решений:
339
Рейтинг:
4.5/5
Ссылка:
Решать

Читаем условие: «Нужно прочитать содержимое файла, который находится в запрещённой папке». 3бать того рот, это очевидно Path Traversal.

Открываем сайт. Видим путь-на3бку.

Интерфейс задачи «Просмотр файлов» и структура каталогов
Ложный флаг из разрешённого файла

3бат, вы кого на3бывать вздумали? Щ, крч, на3бывать будем.

Видим, что можно читать файлы, и видим запрещённую папку forbidden. Ну мы же не лохи, Вась, нам никто ничё запретить не может. Чекаем исходный код, чтобы логику понять.

Исходный HTML-код интерфейса просмотра файлов

Посмотрели, нихYя не поняли, но всё равно идём долбить /app/forbidden/flag.txt.

Ошибка 403 при обращении к запрещённому файлу

Видим пид0раску на ошибке «403». В ахуе, что нам опять чё-то запрещают, пытаемся на3бать систему.

Проверка пути в функции normalize_path

Видим, что проверка startswith — это тупо сравнение строк. Она не банит нашу переменную, а берёт наш путь и смотрит: начинается он с текста /app/forbidden (который лежит в FORBIDDEN_PATH) или нет. Если да — пид0раска 403. То есть эта хYйня судит файл по первым символам строки, а не по тому, какой это реально файл. Ну и славно, значит, её можно на3бать строкой.

Ну мы же не от поцелуя рождённые, понимаем, что прикол в os.path.normpath: обычно она чистит лишние слэши, но ровно два ведущих не трогает. Даём //app/forbidden/flag.txt — startswith("/app/forbidden") видит //app ≠ /app и пропускает, а ядру похYй, //app = /app.

И получаем флаг, Вась.

Результат чтения файла через обход проверки пути
Если вы нашли опечатку или ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter

Также по теме:

Райтап на задачу «Десериализатор»

/Разборы задач

Райтап на задачу «Десериализатор»

Райтап feadal на задачу «Десериализатор»: небезопасная десериализация в PHP, приватные свойства и получение флага через PHP Object Injection.
Прочитать

8

Райтап на задачу «Безвыигрышная лотерея»

/Разборы задач

Райтап на задачу «Безвыигрышная лотерея»

Разбор задачи «Безвыигрышная лотерея»: обходим клиентскую проверку длины имени, разбираем усечение JSON в MySQL и уязвимость CWE-602.
Прочитать

29