zzzphpV1.6.1代码审计

本文仅为了学习交流,严禁非法使用!!!
(随笔仅为平时的学习记录,若有错误请大佬指出,第一次编辑代码审计类的文章,文笔太差,逻辑可能有点不通,大佬勿喷)

毕业论文写了好多天,答辩的时候一直被怼,生活真的太难了,现在终于有时间休息一下。
来审计一下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

此文档仅供学习,参与违法行为与笔者无关

原文地址:https://www.cnblogs.com/lovequitepcs/p/12842482.html