С момента запуска задания прошло две недели, а значит пора подводить итоги.
Взглянем еще раз на задание.
Нам предлагается прочитать некий flag.txt, который распалагается выше дефолтной
веб директории. Узнать это мы можем заглянув в сорцы нашего таска, для нас
его любезно закомментировали.
Повтыкав немного, понимаем что у нас читалка файлов. В целом задача таска и встречающая
нас надпись "Read Me bro!" подтверждает наше предположение. Далее самое интересное - фильтр.
Подробно изучив систему фильтрации нашего инпута, приходим к выводам о блокировки
большинства врапперов и абсолютных путей. Подняться выше с помощью '..' мы также не можем.
И фильтрация php файлов нам на десерт, прочитать index.php просто так не удастся.
Трюки с кодировками также не принесут никаких результатов. Но все же фильтруется не все...
Наш фильтр пропускает ogg:// rar:// ssh2:// compress.bzip2://.
file:// и data:// фильтруются не полностью, в первом случае предупреждение получаем
на попытку использования file:///, во втором пропускается data: и data:/.
Можно было попробовать повтыкать во все и убедиться что первые четыре никаким образом
нам не помогут. Эти обертки не включены по умолчанию и комментарий к первому хинту
подтверждает, здесь их не использовать.
Сообщение от
Baskin-Robbins
↑
Настройки сайта дефолтные
Остается два варианта на выбор - data и file. И тут было важно не пойти по ложному пути.
Обертка file используется исключительно с абсолютными путями, т.е. использование
таких форматов невозможно - file://index.php file://./index.php. Казалось бы ничего
нельзя придумать, ну нельзя ее использовать в таком формате на UNIX-подобных машинах.
И это могло подтолкнуть поглубже покопаться в обертке data, освежить старые знания.
Но это как раз и есть ложный путь. В нашем случае этот враппер ничем не сможет помочь,
чтение будет происходить не из переданного файла, а содержимого самого враппера.
И казалось бы вариантов нет, фильтр не обойти. Но у нас остался открытым вопрос -
почему же с враппером file нельзя использовать относительные пути?
И вот тут то и кроется правильный ответ. В том как мы можем использовать данный
враппер в формате file:// на UNIX-подобных ОС. По этому поводу есть старый репорт 2004 года
https://bugs.php.net/bug.php?id=28820, в котором нам однозначно говорится о невозможности
использования относительных путей. И причина по которой это сделано наталкивает нас
на правильное решение.
.SpoilerTarget" type="button">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:///
.SpoilerTarget" type="button">Spoiler: Ответ
index.php?name=file://localhost/var/www/flag.txt
=====
Всем спасибо.
Пользуясь случаем, поздравляю с Днем защитника Отечества!
Таск закрыт.