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

前言:

Discuz v3.4
ubuntu 1.9
mysql+apache2

0x01 POC


这个构造这样的payload,就能获取phpinfo,然后随便输点什么,使其报错。

根据debug报告我们开始溯源。

0x02 分析漏洞

定位:source/module/portal/portal_index.php::32行

1
include_once template('diy:portal/index');

跟进函数template()
定位:source\function\function_core.php::524行
根据报错信息中的data/template….尝试全局搜索这个字段,最终在这个函数中找到相关代码,位于文件::645行

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

根据报错信息,我们修改的cookie值在DISCUZ_LANG得到体现,所以跟踪DISCUZ_LANG
有两处分别位于restore.phpdiscuz_application.php
此次漏洞位于discuz_application.php,跟踪至此,位于文件::341行

1
define('DISCUZ_LANG', $lng);

查看$lng

看到本文件::305行

1
2
3
if($this->var['cookie']['language']) {
$lng = strtolower($this->var['cookie']['language']);
}

故而$lng可控,
所以我们通过cookie写入命令,最终include_once(),执行代码注入。

0x03 后话

(1)学会使用debug的信息,去追溯源码
(2)学会使用phpstorm,发现这个真的很好用

0%