本文仅为了学习交流,严禁非法使用!!!
(随笔仅为平时的学习记录,若有错误请大佬指出,第一次编辑代码审计类的文章,文笔太差,逻辑可能有点不通,大佬勿喷)
毕业论文写了好多天,答辩的时候一直被怼,生活真的太难了,现在终于有时间休息一下。
来审计一下zzzphpV1.6.1,关于这套cms的审计已经有很多大佬发布了审计文章,故本文章也是借鉴前辈的审计思路进行复现(代码审计还是自己动手多实践,还是自己太菜了)
因为事先知道该cms存在远程代码执行漏洞,故直接搜索eval存在的文件进行分析
分析存在eval函数的这段程序,要想实现远程代码执行,则要控制好$ifstr
的值,我们先单独Copy一份,看看该字符串如何实现闭合。
先进行赋值$zcontent={if:111}{end if}
,打印一下$ifstr
的值,因为程序中使用preg_match_all( $pattern, $zcontent, $matches )
,故$zcontent
必须符合$pattern
的匹配规则,不然无法执行
@eval( 'if(' . $ifstr . '){$flag="if";}else{$flag="else";}' );
要想不报错的执行该程序,首先要闭合if(
,且保证该条件为真,因此这个地方可以填数字,同时屏蔽后面的){$flag="if";}else{$flag="else";};
,且poc要符合正则匹配的格式,所以$zcontent='{if:1)phpinfo();//}{end if}';
,我们打印一下
看看效果怎么样,放入到phpstudy的web目录里面
成功执行,因为该函数处于ParserTemplate
类中,全局搜索类的名字,发现有两处调用
先看看inczzz_client.php是如何调用的
我们可以看到进入到ParserTemplate
类中,调用了$parser->parserCommom($zcontent)
,所以要弄清楚$zcontent
的来源,但进入该循环中,需要的条件是$location=='user'
,$act
共有四个可以选择,他们是case "reg":case "forget":case "login":case "login"
,因此要弄清楚$tplfile=TPL_DIR. 'user'.$act.'.html';
具体是哪个模板,我们使用var_dump
,打印出来,因为$zcontent
的值是受它控制
根据$act
的选择范围,应该是有三种不同的模板位置
F:/web/PHPTutorial/WWW/zzzcms/template/pc/cn2016/html/userreg.html
F:/web/PHPTutorial/WWW/zzzcms/template/pc/cn2016/html/userlogin.html
F:/web/PHPTutorial/WWW/zzzcms/template/pc/cn2016/html/userforget.html
只要我们可以修改这三个模板的内容,插入我们事先调试好的poc就可以实现远程代码执行,我们访问后台,看看有没有这样的模板
发现模板管理里面,并没有这样的模板,因此该思路是不行的,看了大佬的文章,发现可以这样
如果可以进入到else
语句中,或许就可以,因为else
里面有userinfo
,后台模板里也有该模板名称。但条件是必须要登录,前面有登录状态的判断,因此需要注册一个账户,为了确定该模板是不是我后台存在的,我们使用var_dump
打印一下else
语句里面的$incfile
,至于为什么要打印它,因为$zcontent
的值受它控制
注册一个账户,然后再访问http://127.0.0.1/zzzcms/index.php?location=user&act=userinfo
,要查看网页源码才可以看到打印模板的位置
我们进入后台修改该模板的内容,添加一个{if:1)phpinfo();//}{end if}
,前面已经测试过的,不仅要符合正则匹配的格式,还要满足if()
为真,才可以执行phpinfo();//
因为这是登录后台进行操作的,也是登录的状态,我们访问一下http://127.0.0.1/zzzcms/index.php?location=user&act=userinfo
成功getshell
整个思路是:不登录的状态会进入到if (empty($uid))
里面,但里面的模板后台是没有的,如果是登录状态则会进入到else
语句里面,后台模板也刚好有userinfo.html
,把poc
写入到该模板后,在登录状态的时候访问 http://127.0.0.1/zzzcms/index.php?location=user&act=userinfo
就会进入到else
中,从而进入到$parser->parserCommom($zcontent);
里面去,而$zcontent
已经加入了恶意程序,最后会进入到@eval
实现代码执行。
总结:该cms能够实现远程代码执行的思路还是有很多的,有很多的大佬进行了分析总结,就不一一举例,也是第一次写代码审计的文章,讲解不到位的地方,多多包含,大佬勿喷。
参考大佬的文章 https://blog.csdn.net/CSDNPM250/article/details/104211233
此文档仅供学习,参与违法行为与笔者无关