0x01 前言
今天下午,想要练习一下代码审计能力,于是就找了Duomicms1.32版本展开,文章当中参考了DuomiCMS 前台命令执行 // 云屿's Blog (cloudyu.me)与代码审计实战 - FreeBuf网络安全行业门户
0x02 思路
查找eval函数,来展开审计,寻找代码执行,其中包含双引号解析漏洞。
0x03 实战
注意:其中的部分PHP文件做了加密,需要进行解密操作,可以参考DuomiCMS core.class.php 反混淆 // 云屿's Blog (cloudyu.me)
的思路 ,我是直接偷懒拿了2.0版本中的中同名的PHP文件(也就是做了替换),发现效果一样
1、core.class.php的分析
先全局搜索,找到core.class.php(此文件是加密过的,我就在这偷懒了)
找到这段代码(如上图),猜测$strIf可能能够进行恶意传参,向上追踪看看他的前身如下(这里说一下,下面有两个if语句,继续阅读文章,你会发现它是成立的)
这里使用了for循环(如上图),$iar应该是一个二维数组,然后调用了一个函数parsestrif来对$strif做处理,这里先不要急着去看函数是什么样的,在向上追踪$iar,如下
这里使用了preg_match_all函数,不知道的同学可以 看看PHP preg_match_all() 函数 | 菜鸟教程 (runoob.com)
这里的意思是以$labelRule为正则规则,以$content为内容,将匹配到的结果以一个二维数组的形式返回给$iar。
在看看上面if语句,为了使得代码执行下来,必须要在$content里面有 {if: 字样,这时我们追踪本函数parseIf,使用全局搜索功能
2、search.php的分析
一一对每个所包含这个函数的PHP文件分析代码,可以定位到search.php
这里走马观花的看一下,是对$content的多级处理 (如上图)
当我观察怎么样才能执行到下面的代码时,发现这原来在这函数当中(如上图)
这直接就在上面调用了这个函数(如上图)。现在我们明确一下目的:需要找一下$content可不可以控制,也就是找一下他的来源,真的让我去追$content发现有些难度,那怎么办呢?
使用die/exit大法来取巧,这里注意下,原搜索界面是这样的(下图1),写了die后界面是这样的(下图2)与此同时,发现在搜索时传参传入了searchword,也就是此变量可以控制,又因为这是一个全局变量(前面有定义)
在PHP文件当中开始写入die,让他返回$content,其实也没有必要怎么做,为什么呢?因为$searchword无论如何都会通过替换(str_replace函数)被传入$content,这时候我们就开始考虑写木马了,接下来回到我们刚刚进入search.php文件时候的地方(中间有很多对于$content的过滤,我们先放置不管,因为有这么多的规则,一时半会分析不过来,等真正遇到的时候在去看是怎么替换的)
3、回到core.class.php的分析
上图所示,我们首先要保障我们传入的东西里面有 {if: 字样
向下看我猜测buildregx应该是跟正则表达式相关的东西,下面preg_match_all将所匹配到的东西返回给$iar
查看buildregx函数
果然就是将其转化为正则表达式,翻译过来就是(对正则表达式不熟悉的师傅可以去Regex 101 - ZH-CN (regexlearn.com))
/{if:(.*?)}(.*?){end if}/is
所以根据此正则表达式来看必须要{if:}冒号后面的就是我们可以利用的传参,上文也提到了,接下来的两个if判断语句是满足的
最后进入eval函数,eval会把里面的代码当作php代码执行,双引号构成双引号解析漏洞(我觉得这里与eval关系不大,我们的代码其实是双引号解析执行的)
4、写马
先拿phpinfo()试试水,然后去写马
注意下面两段代码,
是search.php当作的(这里借鉴了代码审计实战 - FreeBuf网络安全行业门户)
这里限制了我们传入的参数长度为20
一句话执行成功!!!
5、写在最后的话
非常感谢代码审计实战 - FreeBuf网络安全行业门户与DuomiCMS 前台命令执行 // 云屿's Blog (cloudyu.me)的文章的帮助
本文章可能有写的不对的地方或者思路需要改进的地方,欢迎师傅们批评指正