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
php://output 是一个只写的数据流,许可你以print和echo一样的办法写入到输出缓冲区。
php://filter(重点)
php://filter是一种元封装器,设计用于数据流打开时的筛选过滤运用,也便是作为一种过滤器,可以利用在数据流产生的地方。
在php文档中,标准的定义是这样的:
类似的过滤器还有string.rot13、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
举个例子
题目链接:http://level3.tasteless.eu/
题目直接给出了源码:
根据提示,用php://input 伪协议读取php.ini
找到SERVER[\公众DOCUMENT_ROOT\公众],也便是网站的根目录,可以找到当前脚本的目录,如下:
还可以看到一些文件包含的配置:
rfi是关闭的,也便是allow_url_fopen为Off;allow_url_include开启,可以利用php://input伪协议来列出当前目录下的文件。payload:
绕过 waf 的方法
字典绕过
在一些CTF中会对一些伪协议的关键词进行过滤,如read、resource等等,下面总结了几条绕过方法,在实战中作为字典来跑。
?f=php://filter/convert.base64-encode/resource=login.php(过滤了操作名read)?f=php://filter/read=convert.base64-encode/resource=1.jpg/resource=./show.php(正则 /resource=.jpg/i)?f=data:text/plain,<?php phpinfo()?>?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
这里说一下第二条,这是2018 ISCC中的一道题目的绕过方法。
这里用正则匹配了resource=,我们就可以用重写的方法来绕过正则。
截断包含
截断
这里技巧现在该当是用的比较少了,由于利用截断要知足下面的两个条件:
php版本小于5.3.4magic_quotes_gpc为off./ 截断
点号和路径截断以及./截断,也便是添补大量的./使url长度超过最大值,来达到截断的目的。
详细可以看下面的文章:
https://blog.csdn.net/zvall/article/details/8951925
zip协议和phar协议
在实战过程中,若创造存在文件上传但是没有办法直接上传php文件,可以传zip压缩文件,我们就利用这两个协议,将php文件打包成zip文件来包含里面的php脚本。
phar://、zip://,都可以看到在phpinfo中有相应的描述。
例如脚本文件为1.php,打包成1.zip,然后再改名为1.jpg,上传之后包含1.jpg中的php文件即可。
zip://..(当前脚本的绝对路径).../1.jpg#1.phpphar://...(当前脚本的绝对路径).../1.jpg/1(分割不加后缀名)