freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

Discuz!ML 3.x任意代码执行漏洞之大佬分析之后我分析
水木逸轩 2019-07-28 08:00:54 816090

*本文中涉及到的相关漏洞已报送厂商并得到修复,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担。

首先附上米斯特安全大佬们文章的链接,刚开始有些东西我没看的太懂,于是我就再添了点东西,希望像我一样的小白也能看懂。

一、漏洞综述

漏洞类型:代码执行漏洞

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

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

二、漏洞分析

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

image.png

2.1  报错点一分析

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

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

函数介绍:

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

例如 require_once libfile('function','plugin/test/');实际为 require_once/source/plugin/test/function.php

libfile函数源代码如下图所示:

image.png

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

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

2.2 报错点二分析

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

image.png

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

image.png

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

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

image.png

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

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

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

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

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

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

$cachefile ='./data/template/'.DISCUZ_LANG.'_'.(defined('STYLEID')?STYLEID.'_':'_').$templateid.'_'.str_replace('/', '_', $file).'.tpl.php';

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

'./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,刷新页面抓包

*本文作者:xxx,转载请注明来自FreeBuf.COM在language参数处’.phpinfo().’:

image.png

返回内容:

image.png复现成功。

看起来复现大佬们的漏洞还是挺有意思的,开心。

*本文作者:水木逸轩con,转载请注明来自FreeBuf.COM

# Discuz # 漏洞分析 # 漏洞复现
本文为 水木逸轩 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
油猫饼战队
水木逸轩 LV.2
这家伙太懒了,还未填写个人描述!
  • 14 文章数
  • 21 关注者
浅析反序列化POC
2020-09-18
Corba DEMO流量分析
2020-09-09
从CVE-2018-2628POC看T3反序列化
2020-08-28
文章目录