0x01 背景
上周总结了一些文件包含与伪协议结合的利用方法,本周就找一道例题进行演练。题目源自国外某挑战平台,平台上还有许多其他有趣的challenges题目,小伙伴有兴趣也可以上去好好玩耍一番。
题目地址:http://level3.tasteless.eu/index.php?file=
站点地址:http://chall.tasteless.eu/
0x02 解题过程
首先访问题目站点http://level3.tasteless.eu/index.php?file= 发现给出了题目的源码,所以本题便是要通过代码审计获取flag.
源码信息:
源码中展示的信息还是很直接的:
1.高亮读取 index.php的源码
2.在提示信息中告知要读取PHP.ini ,里面有敏感信息
3.包含了anti_rfi.php,并提示不允许进行远程文件包含
4.使用require_one包含了GET请求的file参数。
根据上面的代码情况可以知道最重要的是第4点,所以可以使用如下思路进行解题。
1.使用读取PHP.ini和anti_rfi.php,获取足够的信息
2.绕过anti_rfi.php并远程包含一句话
3.使用PHP伪协议直接执行代码
分析后大致有如上的思路,第2点是需要开启allow_url_fopen,allow_url_include,第3点需要开启allow_url_include就可以了。
读取php.ini
http://level3.tasteless.eu/php.ini
从php.ini中得到了allow_url_include是on的状态,所以可以使用PHP伪协议执行代码,可以使用php://input的协议,成功执行了代码。
此时需要获取站点的目录信息,由于allow_url_fopen是为off的状态所以无法使用远程文件包含执行命令了,也就无法直接用菜刀去连接并寻找flag,但是已经知道网站的根目录/var/www/chall/level3
此时本想可以使用命令执行的函数执行命令获取目录信息,但是这里似乎做了限制,无法执行系统命令,所以这里需要介绍PHP的scandir()函数会将当先目录下的目录结构以数组的方式保存,请求http://level3.tasteless.eu/index.php?file=php://input [POST DATA:]print_r(scandir('/var/www/chall/level3'))?>得到flag文件的名称。
访问th3_th3_fl4g得到flag的值。
0x03 小小总结
想必上周总结的伪协议与本周文件包含结合的利用方法小伙伴已经GET到了,解题过程大致有如下3步骤:
1.分析站点给出的源代码
2.判断allow_url_fopen,allow_url_include的开启状态,来推测可以使用的伪协议
3.使用相应的伪协议执行代码获取flag
当无法判断allow_url_fopen,allow_url_include的开启状态时,可逐一尝试如下的请求判断哪些能够执行,如果有上传功能那么可能是考phar或zip等压缩流的知识点。
PHP 读文件和代码执行的方式:
1.?file=data:text/plain,
2.?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
3.?file=php://input [POST DATA:]
4.?file=php://filter/read=convert.base64-encode/resource=xxx.php
……
0x04扩展小知识
虽然本题allow_url_fopen是off的状态,所以是无法使用远程文件包含的,如果是ON的话就需要使用文件包含读取anti_rfi.php文件,查看文件中的源码了。
如,使用http://level3.tasteless.eu/index.php?file=php://input [POST DATA] 读取anti_rfi.php文件的源码信息。
从源码中可以看到使用了正则匹配http://, data 匹配到了,返回hacker detected,但是并没有匹配ftp://所以使用ftp://也是一个思路。