好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Discuz! 7.1 & 7.2 后台远程代码执行漏洞及修复

年初跟那个前台代码执行一起看到的,这个清晰明朗的代码执行,看到的人估计也不少,好在坚持了这么久一直没人公布,这大半年还用了很多次,可是...可是,最终还是有人忍不住要公布,要知道公布一个就少一个,以后的以后,你们靠什么去拿站呢?

这个后台执行也算对当时那个前台执行遗失的慰藉吧...好歹也存世大半年,怎么讲都还是有点欣慰的...不知道有入侵t00ls服务器的没,是不是很遗憾,t00ls后台年初已经补上这个 漏洞 了?

其实是老问题了,我也不做过多解释,各位看官有事没事接着挖x1的吧,一旦6.0、7.0、7.1、7.2都挖光了,遇到dz还是绕道吧...

好了,看代码,include/global.func.php:

function sendpm($toid, $subject, $message, $fromid = ) {     if($fromid === ) {         require_once DISCUZ_ROOTuc_client/client.php;         $fromid = $discuz_uid;     }     if($fromid) {         uc_pm_send($fromid, $toid, $subject, $message);     } else {         global $promptkeys;         if(in_array($subject, $promptkeys)) {             $type = $subject;         } else {             extract($GLOBALS, EXTR_SKIP);             require_once DISCUZ_ROOTinclude/discuzcode.func.php;             eval("$message = addslashes("".$message."");");//就这里了,老问题             $type = systempm;             $message = <div> .$subject. {time} .discuzcode($message, 1, 0). </div>

;         }         sendnotice($toid, $message, $type);     } } 要想利用,必须第三个参数:$message可控。

利用方法一:

前台注册的时候用到这个函数:

...     if($welcomemsg && !empty($welcomemsgtxt)) {         $welcomtitle = !empty($welcomemsgtitle) ? $welcomemsgtitle : "Welcome to $bbname!";         $welcomtitle = addslashes(replacesitevar($welcomtitle));         $welcomemsgtxt = addslashes(replacesitevar($welcomemsgtxt));         if($welcomemsg == 1) {             sendpm($uid, $welcomtitle, $welcomemsgtxt, 0);//发送 论坛 短消息,第三个参数在后台被控制,from HdhCmsTestoldjun测试数据         } elseif($welcomemsg == 2) {             sendmail("$username <$email>", $welcomtitle, $welcomemsgtxt);         }     } ... 于是,只要后台控制下注册发送的短消息,即可成功利用该漏洞。

在注册发送短消息的内容里加上:{${phpinfo()}},则可以执行,若要exp,修改年初的那个即是...

利用方法二:

后台member.inc.php可以直接控制$message:

...     if(in_array($sendvia, array(pm, email))) {         $query = $db->query("SELECT uid, username, groupid, email FROM {$tablepre}members WHERE $conditions LIMIT $current, $pertask");                 while($member = $db->fetch_array($query)) {             $sendvia == pm ? sendpm($member[uid], $subject, $message, 0) : sendmail("$member[username] <$member[email]>", $subject, $message);             $continue = TRUE;                 }         } ... 修改下表单即可...

至于exp,我不发了,发出来还是本着技术交流...

最后要说的是,此漏洞对7.0及之前版本无效,对x1以后版本貌似也无效;另外,7.0、7.1、7.2某处有点漏洞,但是在x1里面已经悄悄补上了,x1没细看,但已经相当安全了(也许不是绝对)...题外话了...

修复方案:

还是及时升级吧

查看更多关于Discuz! 7.1 & 7.2 后台远程代码执行漏洞及修复的详细内容...

  阅读:50次