从入口点开始看
定义了很多常量,17行LIB==Lib文件夹
18行包含Lib/X.php
又设置了很多常量,包含了一系列配置文件
36行调用了路由,跟进
进来触发构造方法,使$this->_default = site_config(),跟进
返回了一个数组,因此$this->_default = 返回的数组
之后又调用了view_controller函数,跟进
定义了$controller_arr = _fetch_url函数
然后如果$controller_arr为空的话,就会直接退出
79行检查类的方法是否存在(以_Action结尾),如果存在的话,使用回调函数,不存在的话,返回err
该CMS还要注意.htaccess这个重定向文件:
这个文件的意思是:
$1基本上是从字符串的开头和结尾捕获的所有内容。换句话说,$1 = (.*)。
在我们的重写中,^表示字符串的开始,(.*)说要匹配任何东西,而$表示字符串的结束。因此,基本上,它意味着从字符串开始到结束的所有内容,并将该值赋值为$1。
所以如果我输入www.example.com/tacos-are-good,然后$1 = "tacos-are-good"。所以你的最终重写将是www.example.com/index.php/tacos-are-good。
因此,由于这个重定向文件,我们无法访问到www.example.com/tacos-are-good这个漏洞点,但我们可以使用burp抓包改包,不通过浏览器访问来绕过。
下面来看漏洞点
漏洞点存在于err_Action函数中,首先给出payload:
/home/err/../../&ipconfig>robots.txt&/../lib/X_w160_h160.php
$ext截取了给出payload中的后4位,也就是.php
$url_arr以下划线为界将payload切割,变成一个数组: /home/err/../../&ipconfig>robots.txt/../lib/X _ w160 _ h160 .php
如果该数组长度小于2,就会推出,我们这里长度大于2
接下去宽为数组的键1,为160,高也为160
$noWaterMark为空,程序会在两个160前面拼接_w和_h
$path会去匹配文件所在的文件夹,这里因为我们payload中最终的文件为X.php,因此$path=/lib
接下去,它的宽和高必须满足它的白名单,否则会直接退出,payload中宽和高满足
我们的payload满足程序中的所有条件,因此会直接带入exec函数命令执行。
payload: /home/err/../../&ipconfig>robots.txt&>/../lib/X_w160_h160.php
进入err函数后向上翻2层来到根目录,将ipconfig的结果保存在robots.txt中