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

Web
Задача «Просмотр файлов»
Читаем условие: «Нужно прочитать содержимое файла, который находится в запрещённой папке». 3бать того рот, это очевидно Path Traversal.
Открываем сайт. Видим путь-на3бку.
3бат, вы кого на3бывать вздумали? Щ, крч, на3бывать будем.
Видим, что можно читать файлы, и видим запрещённую папку forbidden. Ну мы же не лохи, Вась, нам никто ничё запретить не может. Чекаем исходный код, чтобы логику понять.
Посмотрели, нихYя не поняли, но всё равно идём долбить /app/forbidden/flag.txt.
Видим пид0раску на ошибке «403». В ахуе, что нам опять чё-то запрещают, пытаемся на3бать систему.
Видим, что проверка startswith — это тупо сравнение строк. Она не банит нашу переменную, а берёт наш путь и смотрит: начинается он с текста /app/forbidden (который лежит в FORBIDDEN_PATH) или нет. Если да — пид0раска 403. То есть эта хYйня судит файл по первым символам строки, а не по тому, какой это реально файл. Ну и славно, значит, её можно на3бать строкой.
Ну мы же не от поцелуя рождённые, понимаем, что прикол в os.path.normpath: обычно она чистит лишние слэши, но ровно два ведущих не трогает. Даём //app/forbidden/flag.txt — startswith("/app/forbidden") видит //app ≠ /app и пропускает, а ядру похYй, //app = /app.
И получаем флаг, Вась.