近期,白帽汇安全研究院监测到互联网上出现了Discuz!ML V3.X的代码注入漏洞。Discuz!ML是一款基于Discuz!X的多语种,全功能,且开源的互联网内容管理平台,能用于搭建论坛、博客、门户网站等一系列具有社交功能的互动网站并自行定制专用功能和组件。默认支持16种语言,并可继续添加其他语言。官方论坛为:http://codersclub.org/discuzx/。没找到和discuz官方的联系。
概况
由于Discuz!ML是基于Discuz!X开发而成,故全球统计数据以Discuz为目标。目前FOFA系统最新数据(一年内数据)显示全球范围内共有115762个基于Discuz的网站。中国使用数量最多,共有51453个,美国第二,共有41177个,中国香港第三,共有12392个,南非第四,共有1990个,中国台湾第五,共有972个。需要注意的是,由于这是开源项目,自行定制的网站很可能并不能及时发现。
全球范围内Discuz网站分布情况如下(仅为分布情况,非漏洞影响情况)
中国大陆地区北京市使用用数量最多,共有12356个,浙江省第二,共有6706台,江苏省第三,共有1901个,广东省第四,共有1854个,河南省第五,共有1458个。
中国大陆范围内Discuz网站分布情况如下(仅为分布情况,非漏洞影响情况)
危害等级
严重
漏洞原理
payload如下:
首先打开portal.php,看到里面包含了class_core.php这个文件。
查看class_core.php文件,这里调用了creatapp()方法,而在creatapp()方法中又调用了discuz_application的instance()方法。
在instance()方法中实例化了discuz_application这个类。
查看discuz_application的构造函数,调用了_init_input()方法,来格式化GPC等变量。
查看"source/class/discuz/discuz_application.php"文件_init_input()方法。在251-253行,304-305行,341行。这里对用户的cookie进行遍历,去除前缀后赋值给了$var,将含有language的cookie值赋值给$lng,最后赋值给DISCUZ_LANG。当我们传入liTq_2132_language=en'.phpinfo().';的时候,DISCUZ_LANG的值为en'.phpinfo().'。
之后进入portal_index.php文件,这里调用了template()方法。
找到function_core.php文件中的template()方法,最关键的一步,直接将前面的DISCUZ_LANG拼接赋值给了$cachefifle变量。$cachefile的值为en'.phpinfo().'。
之后将$cachefile作为checktplrefresh()方法的参数,更新缓存。
跟进checktplrefresh()方法,这里又将$cachefile作为parse_template()方法的参数传了进去。
查看parse_template()方法,在第74行将$cachefile拼接后赋值给了$headeradd,$cachefile的值为en'.phpinfo().' ,这时候闭合了单引号,然后赋值给了$template,最后写入缓存文件。
我们查看缓存文件en'.phpinfo().'_1_1_common_header_portal_index.tpl.php。传入en'.phpinfo().' 闭合了单引号,写入了phpinfo(),后面包含这个文件,导致执行恶意代码。
该漏洞的触发点较多,不止portal.php。
漏洞影响
Discuz!ML v.3.x
CVE编号
##
暂无
POC
目前FOFA客户端平台已经更新针对该漏洞的检测POC。
修复建议
在source/class/discuz/discuz_application.php如下位置加上红框中的代码。
白帽汇从事信息安全,专注于安全大数据、企业威胁情报。
公司产品:FOFA-网络空间安全搜索引擎、FOEYE-网络空间检索系统、NOSEC安全讯息平台 - 白帽汇安全研究院。
为您提供:网络空间测绘、企业资产收集、企业威胁情报、应急响应服务。