漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

栏目: 编程工具 · 发布时间: 6年前

内容简介:前言在分析一些漏洞时,能从相关的漏洞预警和描述中获取的情报往往很少。很多时候,只能通过漏洞描述或者补丁中找到漏洞触发点,然而如何利用,如何找到从入口贯通到漏洞触发点的利用链,这时候就需要我们顺瓜摸藤了。

前言

在分析一些漏洞时,能从相关的漏洞预警和描述中获取的情报往往很少。

很多时候,只能通过漏洞描述或者补丁中找到漏洞触发点,然而如何利用,如何找到从入口贯通到漏洞触发点的利用链,这时候就需要我们顺瓜摸藤了。

有时候,顺着一个瓜(漏洞触发点),还能摸到很多条藤(利用链)。

正文

下面举一个小例子:

近日在PacketStorm看到一个关于国产cms的cve,

https://packetstormsecurity.com/files/151824/ZZZPHP-CMS-1.6.1-Remote-Code-Execution.html

cve编号:

CVE-2019-9041

cve描述

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

再看看packetstormsecurity上关于exploit的介绍

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

根据描述,猜测该漏洞应为SSTI类

如果有升级补丁参照看一下,这个漏洞就很明朗了。

然而官网上最新版本只是2019-1-28更新的1.6.1

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

这个1.6.1版本,正是存在漏洞的版本。

之前完全没有听说过这个cms,这个漏洞又有cve。决定拿来和大家分享下,看看怎么顺瓜摸藤。

分析

从漏洞发现者所提供的exploit来看,这个漏洞的触发应该是需要后台权限。漏洞触发点位于inc/zzz_template.php中的parserIfLabel方法中,并且需要修改search模板并通过搜索功能执行该利用点。

首先先看下inc/zzz_template.php中的parserIfLabel方法

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

可以看到有一处eval方法,这个应该是最终代码执行触发的地方。

既然触发点(瓜)已经找到了,那继续往上跟,找到可用的调用链

parserIfLabel方法只在两处被调用

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

先看位于第2238行的第二处调用

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

这处在parserIfLabel方法自身内部,递归调用来解析嵌套。此处虽然调用了parserIfLabel方法,但是并不处于parserIfLabel方法的调用链的上层,因此排除。

再看第一处:位于23行这处

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

parserCommom方法调用parserIfLabel方法并将$zcontent传入其中。

再看看parserCommom方法在何处被调用

跟入zzz_client.php中

zzz_client.php中一共四处调用了parserCommom方法,每一处都将名为$zcontent的参数传入其中。

这四处parserCommom分别位于四个ifelse条件中。

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

先一处处来看,首先选个短的看起来容易触发的条件分支先来。

先看第二处,这里elseif中的条件最短,为 $conf['iscache']==1

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

只要$conf['iscache']==1,就可以顺利的进入这个条件分支,parserCommom就能有机会被调用

查看配置文件,此处默认为0

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

但是由于漏洞介绍,这是个后台漏洞,那默认我们可以有后台的操作权限

于是我在后台管理那把缓存开启了

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

现在zzz_config.php中

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

可见iscache现在为1了。

现在的思路:

1、$conf['iscache'] 目前已经是1,稳稳的进入这个elseif分支

2、由于此处执行点位于zzz_client.php中,而zzz_client.php文件中没有定义任何函数,代码逐行执行,一马平川。可以看下图感受下

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

3、只有找到zzz_client.php被加载的地方,才能进入该elseif分支执行我们的parserCommom

4、找到控制传入parserCommom方法中$zcontent值的方法,将构造好的$zcontent传入我们的eval中执行。

首先要找zzz_client.php被加载的地方

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

看起来这四处都可以加载zzz_client.php

我们首先选主入口index.php

不出意外,直接执行到该条件分支内

此时传入load_file方法中$tplfile值为

C:/wamp64/www/analysis/zzzphp/template/pc/cn2016/html/index.html

加载的是index.html模板

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

也就是说,我们只要在index.html中加入payload,就可以触发底层的eval执行任意代码。

找到后台编辑模板处

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

编辑index.html,插入payload

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

不出所料,成功执行

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

此时传入eval中的$ifstr值是phpinfo()

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

但是需要注意的是 如下图

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

当cachefile在第一次执行create_file后,就会被成功创建

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

下一次再进入elseif($conf['iscache']==1)分支后,

由于

漏洞分析之——顺瓜摸藤(ZZZCMS getshell )

这个if条件检测cachefile存在并且更改时间晚于tplfie(index.html),不满足此条件分支,不会再次调用$parser->parserCommom($zcontent)的。

总结来说,此处可以远程代码执行,但是当cachefile被创建后,此处调用链失效。

到此为止,已经找到了一处不同于原作者的利用链。但仅仅zzz_client中就有四个分支调用了存在漏洞的函数。

也就是说,同一个漏洞触发点所生产的利用链远远不止两处,后续分析有机会再放出,有兴趣的朋友也可以自己玩玩。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

腾讯网UED体验设计之旅

腾讯网UED体验设计之旅

任婕 等 / 电子工业出版社 / 2015-4 / 99.00元

《腾讯网UED体验设计之旅》是腾讯网UED的十年精华输出,涵盖了丰富的案例、极富冲击力的图片,以及来自腾讯网的一手经验,通过还原一系列真实案例的幕后设计故事,从用户研究、创意剖析、绘制方法、项目管理等实体案例出发,带领读者经历一场体验设计之旅。、 全书核心内容涉及网媒用户分析与研究方法、门户网站未来体验设计、H5技术在移动端打开的触控世界、手绘原创设计、改版迭代方法、文字及信息图形化设计、媒......一起来看看 《腾讯网UED体验设计之旅》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具