С момента запуска задания прошло две недели, а значит пора подводить итоги. Взглянем еще раз на задание. Нам предлагается прочитать некий flag.txt, который распалагается выше дефолтной веб директории. Узнать это мы можем заглянув в сорцы нашего таска, для нас его любезно закомментировали. Повтыкав немного, понимаем что у нас читалка файлов. В целом задача таска и встречающая нас надпись "Read Me bro!" подтверждает наше предположение. Далее самое интересное - фильтр. Подробно изучив систему фильтрации нашего инпута, приходим к выводам о блокировки большинства врапперов и абсолютных путей. Подняться выше с помощью '..' мы также не можем. И фильтрация php файлов нам на десерт, прочитать index.php просто так не удастся. Трюки с кодировками также не принесут никаких результатов. Но все же фильтруется не все... Наш фильтр пропускает ogg:// rar:// ssh2:// compress.bzip2://. file:// и data:// фильтруются не полностью, в первом случае предупреждение получаем на попытку использования file:///, во втором пропускается data: и data:/. Можно было попробовать повтыкать во все и убедиться что первые четыре никаким образом нам не помогут. Эти обертки не включены по умолчанию и комментарий к первому хинту подтверждает, здесь их не использовать. Остается два варианта на выбор - data и file. И тут было важно не пойти по ложному пути. Обертка file используется исключительно с абсолютными путями, т.е. использование таких форматов невозможно - file://index.php file://./index.php. Казалось бы ничего нельзя придумать, ну нельзя ее использовать в таком формате на UNIX-подобных машинах. И это могло подтолкнуть поглубже покопаться в обертке data, освежить старые знания. Но это как раз и есть ложный путь. В нашем случае этот враппер ничем не сможет помочь, чтение будет происходить не из переданного файла, а содержимого самого враппера. И казалось бы вариантов нет, фильтр не обойти. Но у нас остался открытым вопрос - почему же с враппером file нельзя использовать относительные пути? И вот тут то и кроется правильный ответ. В том как мы можем использовать данный враппер в формате file:// на UNIX-подобных ОС. По этому поводу есть старый репорт 2004 года https://bugs.php.net/bug.php?id=28820, в котором нам однозначно говорится о невозможности использования относительных путей. И причина по которой это сделано наталкивает нас на правильное решение. Spoiler: spoiler The reason relative paths are not supported with the file:// wrapper comes down to a compromise in how UNC paths are dealt with (and more specifically how / are fuzzily interpreted as \ for windows installations). For Example: file://foo/bar Could be interpreted as a relative URI: foo/bar from the current working directory, OR it could be interpreted as a UNC: \\foo\bar (share `bar` on computer `foo`). Но не одним баг-репортом единым живы. Прям готовое решение, просто скопируй и вставь, можно было найти почитав RFC и! википедию по запросу file:// схема URI. https://tools.ietf.org/html/rfc8089 https://ru.wikipedia.org/wiki/File_(схема_URI) В итоге правильным решением было использование обертки file в таком формате: file://<host>/<absolute path> Spoiler: Ответ index.php?name=file://localhost/var/www/flag.txt ===== Всем спасибо. Пользуясь случаем, поздравляю с Днем защитника Отечества! Таск закрыт.
Converting LFI into RCE by chaining PHP encoding filters https://www.synacktiv.com/publications/php-filters-chain-what-is-it-and-how-to-use-it.html