Discuz ML! V3.x 代码注入漏洞

前言

之前在安全客上看到最近的爆出一个漏洞,属于危害较大,利用简单的类型;原理挺简单,关键是能不能发现的问题。

0x00 漏洞描述

Discuz!ML是一个由CodersClub.org创建的多语言,集成,功能齐全的开源网络平台,用于构建像”社交网络”这样的互联网社区。

2019年7月11日,Discuz!ML被发现存在一处RCE,主要是因为对cookie字段的处理不当,没有对其中的language字段进行过滤,导致攻击者通过精心构造的payload可以以拼接的方式向php缓存文件中写入恶意代码,达到远程代码执行。

首先,通过cookie传入payload,构造好的payload被写入template文件中:

接着,这个被插入payload的template.php文件被include,造成代码执行:

0x01 影响版本

  • Discuz! ML v.3.4
  • Discuz! ML v.3.3
  • Discuz! ML v.3.2

0x02 漏洞分析

主要逻辑在漏洞描述说得比较清楚,详细的代码审计可以戳这:Discuz ML! V3.X 代码注入漏洞深度分析

整个流程要仔细看一遍,其实逻辑很简单。

0x03 漏洞复现

环境搭建

官网下载:http://discuz.ml/download
解压之后将upload文件夹拷贝到web目录下, 浏览器访问安装即可。

漏洞定位

从上面的漏洞分析可以看出,由于$lng参数可控,导致$cachefile部分可控,$cachefile又被拼接到$headeradd中,$headeradd又被带到$template中,而最后写入配置文件时就是写$template,导致代码注入。

漏洞执行

由上可知,凡是有template()方法的页面应该时都能注入的,这里我以首页(index.php)为例:

首先抓包:

然后构造payload:

成功执行:

修复建议

这里参考米斯特安全团队给出的:

/source/class/discuz/discuz_application.php 第338行之后341行之前加入该代码暂缓此安全问题:

1
2
3
4
5
$lng = str_replace("(","",$lng);
$lng = str_replace(")","",$lng);
$lng = str_replace("'","",$lng);
$lng = str_replace('"',"",$lng);
$lng = str_replace('`',"",$lng);

0x04 参考链接

Discuz!ML V3.X 代码注入分析

Discuz ML! V3.X 代码注入漏洞

Discuz ML! V3.X 代码注入漏洞深度分析

小结

一开始觉得这个漏洞很复杂,后面发现其实还简单,就把自己的理解记录了一下,继续加油吧。

0%