PHP伪协议
PHP封装协议
PHP有很多内置URL风格的封装协议,这类协议fopen(),copy(),file_exists(),filesize()等⽂件系统函数所提供的功能类似。常见协议如下: file://          访问本地⽂件系统
ftp://          访问FTP(s)URLs
php://        访问输⼊/输出流(I/O streams)
zlib://          压缩流量
data://        数据(RFC 2397)
ssh2://        Secure Shell 2
expect://      处理交互式的流
glob://          查匹配的⽂件路径
//摘录⾃《Web安全深度剖析》
这个封装协议多⽤于⽂件包含漏洞
php伪协议的分类
伪协议是⽂件包含的基础,理解伪协议的原理才能更好的利⽤⽂件包含漏洞。
php://input
php://input代表可以访问请求的原始数据,简单来说POST请求的情况下,php://input可以获取到post的数据。
使⽤条件:include( )、include_once( )、file_get_contents( )
⽐较特殊的⼀点,enctype=”multipart/form-data”的时候 php://input 是⽆效的。
⽤法举例:
使⽤file_get_contents函数的伪协议包含有个经典的例⼦;
可以使⽤fputs⽂件输⼊流直接服务器某⼀存在的⽬录下写⼊⽂件。
php://output
fopen中文路径问题php://output 是⼀个只写的数据流,允许你以print和echo⼀样的⽅式写⼊到输出缓冲区。
php://filter(重点)
php://filter是⼀种元封装器,设计⽤于数据流打开时的筛选过滤应⽤,也就是作为⼀种过滤器,可以使⽤在数据流产⽣的地⽅。
php⽂档中,标准的定义是这样的:
类似的过滤器还有13、string.strip_tags、zlib.deflate和zlib.inflate等等,⽬前只要知道convert.base64-encode就好了。
URL 中包含点的常见形式
file = xxx 或者 file = xxx.php
allow_url_fopen和allow_url_include
在测试了包含点存在包含漏洞以后,并不是都可以使⽤filter伪协议包含出源码的,因为allow_url_fopen
和allow_url_include会影响到fopen和include等函数对于伪协议的⽀持。allow_url_include影响php://input的使⽤,若不打开则⽆法使⽤。
当allow_url_fopen打开时,可以包含任意url。
例如只打开allow_url_include时,只能包含远程⽂件和使⽤php://input
举个例⼦
题⽬直接给出了源码:根据提⽰,⽤php://input 伪协议读取php.ini
到SERVER["DOCUMENT_ROOT"],也就是⽹站的根⽬录,可以到当前脚本的⽬录,如下:还可以看到⼀些⽂件包含的配置:
rfi 是关闭的,也就是allow_url_fopen 为Off ;
allow_url_include 开启,可以使⽤php://input 伪协议来列出当前⽬录下的⽂件。
payload:
//摘录⾃i 春秋博客园
附上⼀题⽂件包含
题⽬提⽰flag在index.php⾥,直接访问这个页⾯并没有,但是看到url
我们直接通过封装协议去读取index.php的源代码
这样我们会得到base64后的源码,我们去解码⼀下
file=php://filter/read=convert.base64-encode/resource=index.php
由此我们得到flag