前言:
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.php和discuz_application.php
此次漏洞位于discuz_application.php,跟踪至此,位于文件::341行1
define('DISCUZ_LANG', $lng);
查看$lng
!
看到本文件::305行1
2
3if($this->var['cookie']['language']) {
$lng = strtolower($this->var['cookie']['language']);
}
故而$lng可控,
所以我们通过cookie写入命令,最终include_once(),执行代码注入。
0x03 后话
(1)学会使用debug的信息,去追溯源码
(2)学会使用phpstorm,发现这个真的很好用