迅睿cms 前台RCE

写在前面

这是开始漏洞演示成功时录的屏,算是昙花一现的前台GETSHELL。

因为危害大,利用难度低,我匆匆写了报告,提交CNVD后,立即联系了厂家,他们也很迅速,20分钟就修好了,commit了新代码上去。

还挺难过的,这个洞跟了两天才挖出来,他修复好之后,我绷不住了,没有一个属于他的漏洞版本,成就感全无。我想这是很多白帽子都有过的感情,知道他应该被修。

不啰嗦了,开始分析吧。

漏洞分析

在大概了解了目录,草草看了遍文档后,就开始审了。

get 的 s 参数可以控制访问的控制器在哪个目录,以至于我们可以直接通过 index.php?s=api&c=xxx 进入 api 文件夹调用任意控制器。

Api控制器的 template 方法可以动态调用模板。

OpenSNS 的前台RCE漏洞是因为变量覆盖,导致模板渲染的时候参数可控,再因为模板渲染后有可利用的方法。

所以我将目标转向此方法,并决定深入跟进。

这里的三个参数是可以控制的,通过GET传入,

但是有过滤,无法目录穿越,还不能有 /,简单来说,就是只能有文件名,继续往下跟。

我跟了一遍,$module 只能是固定的几个数值,且$app后续并不会用到。这里不细究。

这里的 Service::V()

就是返回一个 View 对象,assign() 方法就是遍历地将数据键值写进$this->_options

然后调用 display 方法,$file 是我们可以控制的,跟进。

这里存在一个 extract 函数,会造成变量覆盖,类型是覆盖原来的值,$this->_options 是 我们可以通过GET传入的。看到这里,想到的就是 OpenSNS 的变量覆盖,造成模板文件中的内容可控,然后RCE。更加坚定这里有洞。

继续往下看。

跟进 get_file_name()

很头痛对吧,我当时也很头痛,眼睛都要花了,而且这些大都使用的是属性拼接文件名,而且属性的值还需要溯源会去,寻找可控点。

中间的过程就不bb了,直接说结果。如果这个方法没有传入 $dir 的值,那么就会在

这个目录下,找文件,因为文件名不能有 / , 所有,能用的只有这几个展示出来的,如果$dir='admin' ,就会在这里找,同样不能去别的目录。

我们可以控制 $phpcmf_dir 的值,然后使得返回的 模板文件名可控。

看这些html 文件,且都没有渲染过的话是一定找不到问题的,我一开始是想把他的模板解析的方法,拿出来,写个遍历文件夹脚本把模板文件全解析出来审。后来又懒得,

这里会生成渲染后的文件,并返回文件内容,我就写了个脚本把文件夹里的 .html 文件跑出来,再遍历地访问一遍,那么他就会自己生成文件,不需要我去拿他的方法。

?s=api&c=api&m=template&name=xxxx.html&phpcmf_dir=admin

在缓存中找到模板文件,挨个跟一下,或者你想要全局搜危险函数也都可以,但模板里没啥危险函数,大都去调用了其他类的方法。模板解析后,就会去包含他。api_related.html

这个模板文件被解析后,调用了如下方法。

$this 指向的是 实例化的 view 对象,跟进。

这里面有个 call_user_func_array 可以利用

只不过需要稍微控制一下参数。

这里将传入的参数,用空格分隔,然后遍历。

再用 = 号分隔作为键值,传进 $system

注意看这里的参数, action=module 作为第一个,那么到后面的时候 $system['action'] 就是 module,不能是 function,但我们可以控制 $mid 甚至后面的变量,配合空格,再次传入一次 action=fuction ,然后就会覆盖前面的action。说是只能出现一次,但还是可以覆盖,奇怪。

这里还可以写入 $param , 只需要传入 name=system , 那么 $param['name'] 的值就可以控制了。

进入这里的条件是 !$cache 就行, 简单来讲就是没有缓存,而一开始我们是没有设置缓存的。 传入的参数 $p 就是 param0=calc 那么 $p[0]='calc'call_user_func_array 是不会考虑数组的键的,只会将值作为参数。

构造payload 如下

http://localhost:2333/index.php?s=api&c=api&m=template&app=admin&name=api_related.html&phpcmf_dir=admin&mid=%20action=function%20name=phpinfo%20param0=-1

由于

导致页面并不会显示成html格式,而是作为字符串,配合 json数据返回。

可以看到下面phpinfo 的内容。

直观的话,可以利用system 回显一个 calc

还可以写入木马,只不过又需要绕过一些东西,下一篇渗透讲。

写在后面

其实我自认为暂时没人挖出来这个漏洞,但我还是联系了厂商,

邮件中的图片是在其官网测试成功的截图。

以下是厂商的修复,以及git的commit

https://gitee.com/dayrui/xunruicms/commit/80e2d8f3008384d926c64163b7334a260edc0a51

其实后面还有可以包含文件的模板,而且文件上传点的过滤也并不严谨,但将 extract 的type 设置成跳过已有变量,直接阉割掉 $phpcmf_dir,导致无法获取我们想要的模板 ,也没有再看下去的意义了。留下的只有网上没有更新的站了,不过修复很快,过了一晚,几乎就全都修好了,希望站长尽快下载补丁。

点击收藏 | 2 关注 | 2
登录 后跟帖