您有一份CTF代码审计文件等待查收

0×01 背景

上周总结了一些文件包含与伪协议结合的利用方法,本周就找一道例题进行演练。题目源自国外某挑战平台,平台上还有许多其他有趣的challenges题目,小伙伴有兴趣也可以上去好好玩耍一番。 

题目地址:http://level3.tasteless.eu/index.php?file= 

站点地址:http://chall.tasteless.eu/

背景.png

0×02 解题过程

首先访问题目站点http://level3.tasteless.eu/index.php?file= 发现给出了题目的源码,所以本题便是要通过代码审计获取flag.

源码信息:

 源码.png

源码中展示的信息还是很直接的:

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

ini.png

从php.ini中得到了allow_url_include是on的状态,所以可以使用PHP伪协议执行代码,可以使用php://input的协议,成功执行了代码。

 daima.png

2.png

此时需要获取站点的目录信息,由于allow_url_fopen是为off的状态所以无法使用远程文件包含执行命令了,也就无法直接用菜刀去连接并寻找flag,但是已经知道网站的根目录/var/www/chall/level3

此时本想可以使用命令执行的函数执行命令获取目录信息,但是这里似乎做了限制,无法执行系统命令,所以这里需要介绍PHP的scandir()函数会将当先目录下的目录结构以数组的方式保存,请求http://level3.tasteless.eu/index.php?file=php://input [POST DATA:]<?php print_r(scandir(‘/var/www/chall/level3′))?>得到flag文件的名称。

mingcheng.png

访问th3_th3_fl4g得到flag的值。

fangwen.png

0×03 小小总结

想必上周总结的伪协议与本周文件包含结合的利用方法小伙伴已经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,<?php phpinfo()?>

2.?file=data:text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

3.?file=php://input [POST DATA:]<?php phpinfo()?>

4.?file=php://filter/read=convert.base64-encode/resource=xxx.php

……

0×04扩展小知识

虽然本题allow_url_fopen是off的状态,所以是无法使用远程文件包含的,如果是ON的话就需要使用文件包含读取anti_rfi.php文件,查看文件中的源码了。 

如,使用http://level3.tasteless.eu/index.php?file=php://input [POST DATA] <?php highlight_file(‘anti_rfi.php’)?>读取anti_rfi.php文件的源码信息。

yuanma.png

从源码中可以看到使用了正则匹配http://, data 匹配到了,返回hacker detected,但是并没有匹配ftp://所以使用ftp://也是一个思路。

 silu 1.png

silu 2.png

 640.webp.jpg