前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Discuz!ML 3.x任意代码执行漏洞分析

Discuz!ML 3.x任意代码执行漏洞分析

作者头像
FB客服
发布2019-07-29 12:54:11
1.8K0
发布2019-07-29 12:54:11
举报
文章被收录于专栏:FreeBufFreeBuf

漏洞类型:代码执行漏洞

影响系统及版本:Discuz!ML V3.2-3.4

漏洞原因:Discuz!ML 系统对cookie中的l接收的language参数内容未过滤,导致字符串拼接,从而执行php代码。

二、漏洞分析

根据米斯特大佬们提供的报错界面,我对其中的三个报错点一一进行了分析,三个报错点如下图所示(还有米斯特大佬们的水印)。

2.1 报错点一分析

发现首先是portal.php函数出错,把这张图放大看,发现是对cookie中的language参数进行拼接而导致的报错,根据这个参数的语义判断应该是调用语言模板的时候因为找不到相应的模板而发生的错误,那么先定位portal.php报错的第35行,该文件路径:

紧接着定位libfile函数,文件加载路径函数。

函数介绍:

libfile($libname, $folder = ''),包含2个参数:$libname 和 $folder,该函数读取source目录下的$folder子目录作为基础部分。

代码语言:javascript
复制
例如 require_once libfile('function','plugin/test/');实际为 require_once/source/plugin/test/function.php
代码语言:javascript
复制
libfile函数源代码如下图所示:

DISCUZ_ROOT为定义网站根目录的常量,realpath函数为返回绝对路径函数,到此处第一个报错就已经分析完毕,原因是系统因为找不到一个php文件而报的错。

好像第一个错误没有什么用,接着开始分析第二个错误。

2.2 报错点二分析

还是先根据错误定位到引用函数文件,文件路径source/module/portal/portalindex.php,然后定位到源函数所在的文件,引用的地方好定位,位置在/source/function/functioncore.php,直接上图

然后这个函数写的还贼长,哎,没得办法,这个时候只能靠运气了,搏一搏,单车变摩托,首先百度,这个函数的作用也就是个调用模板的函数。

然而这个函数写了160行代码,找个大表哥的写的代码注释吧,先扔个参考链接http://www.discuz.net/thread-2702143-1-1.html。

此时我发现了思路有些繁琐,然后就去找第三个错误的提示内容,为了找到是哪里出了问题,我把这段代码放到了txt文件中,根据第三个错误提示的信息开始了全文搜索,终于,根据关键字tpl.php值搜索到一处与language这个函数语义有关的东西DISCUZ_LANG。

既然是语言参数出了问题,还是个常量,那就去找找常量定义的地方,全局搜DISCUZLANG,跟踪到/source/class/discuz/discuzapplication.php

可以看到,将$lng的值给了DISCUZ_LANG,追踪$lng在何处定义,全局搜索$lng,找到了定义$lng的地方(图中第一个箭头)

到此为止,又出现个var,这是个啥,我只知道var[‘cookie’][‘language’]的意思就是cookie中的language的值。

以上可以分析出,从获取language到DISCUZ_LANG拿到值的过程中,并没有对其进行过滤。

那么现在必须确定报错问题是怎么出现的了,看下图:

出现了这样的代码,直接拼接,然后RCE

代码语言:javascript
复制
$cachefile ='./data/template/'.DISCUZ_LANG.'_'.(defined('STYLEID')?STYLEID.'_':'_').$templateid.'_'.str_replace('/', '_', $file).'.tpl.php';

拼接单引号和’.phpinfo().’

代码语言:javascript
复制
'./data/template/'.'.phpinfo().'.'_'.(defined('STYLEID')?STYLEID.'_':'_').$templateid.'_'.str_replace('/', '_', $file).'.tpl.php';

按理来说可以RCE

总结下大概流程从cookie中获取了language的值,然后给了$lng,接着$lng又给了DISCUZ_LANG,系统通过template函数调用模板文件,template函数执行,执行到$cachefile的时候,执行构造的代码。

三、漏洞复现

访问站点www.***.com/forum.php,刷新页面抓包

在language参数处’.phpinfo().’:

返回内容:

复现成功。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FreeBuf 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二、漏洞分析
    • 2.1 报错点一分析
      • 2.2 报错点二分析
      • 三、漏洞复现
      相关产品与服务
      Discuz!
      Discuz! 是全球领先的论坛社区应用系统,自2001年6月面世以来,服务超过300多万网站用户案例。现在,借助 Discuz! ,您不仅可以使用搭建传统的社区论坛,更可轻易的构建面向移动互联网时代的私域流量和社交圈子类的应用,并快速启动业务。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档