/Разборы задач
25 октября 2026
Райтап на задачу «Просмотр файлов»
Райтап feadal на задачу «Просмотр файлов»: проверка пути через startswith, поведение os.path.normpath и обход запрета на чтение файла.10
10
Ну чё, ребятки, соскучились, 3пта? Сегодня разбираем очередной вебчик.
Заходим на сайт, а там форма, которая наш ввод пихает прямо в unserialize() без единой проверки. Ну пи3дец, разраб, ты вообще еб4нутый? Сам себе могилу выкопал. В index.php лежит вот такой оху3нный подгон:
__destruct() — магический метод, ПХП дёргает его сам, без спроса, когда объект откидывается. То есть нам даже жопу рвать не надо: слепим рецепт FileReader с flag.txt внутри, скормим форме — пыха соберёт объект, потом выкинет его нахYй и уже своими же руками высрет нам флаг. Вот это и есть PHP Object Injection, 3бать, — на3бываем сервак его же функцией.
Но есть одна подстава, Вась, — эта шлюха private $filename: пыха оборачивает имя свойства нуль-байтами (\0FileReader\0filename, длина 20 (вот же непонятный пи3дец)). Нуль-байт с клавы хYй вобьёшь, пальцами его не настучишь → берём большую S, 3пта, ведь эта тварь жрёт хекс-эскейп \00 и сама понимает его как нуль-байт. НихYйно, 3бать.
Готовый рецептик, ёптыть:
O:10:"FileReader":1:{S:20:"\00FileReader\00filename";s:8:"flag.txt";}Чего 3блом щёлкать, берём и отправляем этот непонятный пи3дец и получаем флаг. Честно, до сих пор сам в ахYе:
Мораль, пацаны: никогда, не суй пользовательский ввод в unserialize(), иначе прилетит такой вот красавчик и вы3бет тебя твоим же кодом, а ты даже не заметишь.