一分钟速通CVE-2019-13956漏洞复现Discuz!ML远程代码执行

0x01 漏洞介绍

1
2
3
描述:
Crossday Discuz! Board(简称 Discuz!)是北京康盛新创科技有限责任公司推出的一套通用的社区论坛软件系统。
Discuz!ML 3.2 到 3.4 允许远程攻击者通过修改过的语言 cookie 执行任意 PHP 代码,如将 4gH4_0df5_language=en 更改为 4gH4_0df5_language=en'.phpinfo().' 所示;(如果使用了随机前缀 4gH4_0df5_)。

漏洞出现在传入cookie的language值时,逻辑是直接将传入的语言拼接成一个缓存文件,然后利用文件包含解析

由于并没有做过滤,我们拥有可控的文件名

0x02 poc

抓包,在cookie中原有语言后,加入

1
'.phpinfo().'

image-20260422191105550

查看flag即可

image-20260422191153901

0x03 漏洞溯源:

下载源码

1
https://bitbucket.org/vot/discuz.ml/downloads/

1.upload\source\module\portal\portal_index.php中搜索template找到漏洞点:存在文件包含

image-20260422192509150

为了知道template到底做了什么,使用正则表达式全局搜索(vscode中快捷键为CTRL+shift+f)

1
function\s+template\s*\(

2.发现template函数存在以下代码

1
2
3
4
5
6
7
8

$cachefile =
'./data/template/'.DISCUZ_LANG.'_'.(defined('STYLEID') ? STYLEID.'_' : '_').$templateid.'_'.str_replace('/', '_', $file).'.tpl.php';

插入:
'.phpinfo().'
变成:
'./data/template/'.''.phpinfo().''.'_'.

详细见图

image-20260422193356333

也就是说:把DISCUZ-LANG拼接成了一个cache缓存文件(tpl.php)然后返回了这个文件,继续研究我们拿到的“DISCUZ-LANG”是什么

3.进行全局搜索,在\upload\source\class\discuz\discuz_application.php中,我们发现变量lng的值付给了它

1
2
// define DISCUZ_LANG
define('DISCUZ_LANG', $lng);

4.搜索lng看到此值来源于传入的cookie

1
2
3
4
5
6
// set language from cookies
if($this->var['cookie']['language']) {
$lng = strtolower($this->var['cookie']['language']);
if(!isset($this->var['config']['languages'][$lng])) {
$lng = '';
}