Ethan's Blog

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

字数统计: 716阅读时长: 2 min
2019/08/09 Share

前言

2019年7月11日,Discuz!ML爆出一个远程代码执行漏洞,漏洞触发简单,但是危害很大!攻击者在请求流量的cookie字段中的language参数处插入构造的payload,即可造成任意代码执行。正好我在某实验室应急了这个漏洞,所以就想趁此分析一下它的触发流程!

正文

漏洞原因

cookie字段中的language参数未经过滤,直接被拼接和写入到了缓存文件之中,而后缓存文件又被加载,从而造成了任意代码执行!

影响版本

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

分析过程

本文静态分析+动态调试的方法分析此漏洞!

由于这个漏洞是由于对cookie中language字段值未过滤而导致的,我们首先找到对language字段操作的代码段

代码段位于\source\class\discuz\discuz_application.php的304行,我们在305行处下个断点,然后在cookie传入我们的payload查看运行结果

我们可以发现cookie中的language字段被取了出来,并赋值给了$lng变量,我们再跟踪一下$lng

变量看看它又被进行了什么操作。

我们发现在同文件341行处,$lng变量又被赋值给了DISCUZ_LANG常量

这里DISCUZ_LANG常量并没进行任何过滤,因此是完全可控的!

我们继续跟踪DISCUZ_LANG常量又被哪里引用到了?

我们可以追踪到source\function\function_core.php第644行

我们可以发现在生成cachefile时,DISCUZ_LANG常量会被拼接到cachefile变量里面!文件会被写入/data/template目录下

我们的恶意代码是传进去了,但是他又是怎么被执行呢?

接下来,我们分析一下,它究竟是为什么会被执行?

我们可以发现$cachefile变量是在template方法中定义的,它最终返回的是生成的缓存路径及文件名称

最简单的方法是我们继续跟,看这个返回值会被怎么处理,经过动态调试我们发现这个返回的方法路径进了我们的缓存文件并且被文件包含进去了

我们知道被include包含的内容会被作为php代码执行,因此造成了代码执行!

这里我们通过查找调用template方法的位置,可以发现不止一个位置存在代码执行

除去我们的缓存文件还有很多地方调用!

综上所述,我们可以很清楚的知道这个漏洞的触发流程!

后言

POC的编写,大家可以根据漏洞触发过程来编写,并不是很难!在此推一下Pocsuite3框架。自从来到某实验室实习,学习不了东西!祝大家周末愉快!

CATALOG
  1. 1. 前言
  2. 2. 正文
    1. 2.1. 漏洞原因
    2. 2.2. 影响版本
    3. 2.3. 分析过程
  3. 3. 后言