Что если вы контролируете путь к файлу для чтения в PHP, но результат отображается только при соответствии каким-то условиям?



Например, это может быть проверка через getimagesize() на то, что прочитанный файл является изображением. Также содержимое может выводиться не целиком, а лишь частично.

Ещё ситуация: у вас XXE, и вы хотите читать файлы с угловыми скобками (те же PHP-скрипты). Просто так это зачастую не сделать из-за нарушения синтаксиса XML.



На помощь приходят обёртки и фильтры:

https://www.php.net/manual/ru/filters.convert.php

https://www.php.net/manual/ru/filters.compression.php

https://www.php.net/manual/ru/filters.string.php

https://www.php.net/manual/ru/migration53.new-stream-filters.php



PHP позволяет на лету преобразовывать содержимое, прочитанное из ресурса (как из файловой системы, так и по сети).

Например, вот так можно прочитать веб-страницу, на лету убрать из неё теги, сжать с zlib и закодировать в base64:

php://filter/read=string.strip_tags|zlib.deflate|convert.base64-encode/resource=http://localhost:1337/secret.xml



Комбинируя фильтры, можно зачастую извлечь данные, которые приложение не хотело отдавать из-за валидации в XML-парсере или на уровне скрипта.