2012-11-28: 积极联系厂商并且等待厂商认领中,细节不对外公开 2013-01-12: 厂商已经主动忽略漏洞,细节向公众公开
该产品又名:齐博分类信息系统 v6 bilud 20101112 不知道为什么该公司没有在wooyun注册,在chinaz的下载排行该应用排行第三,如果不是刷的话。该漏洞的描述估计更像是一篇漏洞利用示范。
在 /member/company.php 中的第13行:
@extract($_POST);
这句代码会将POST中的所有东西注册未全局变量。那么,如何利用呢,比较有意思的是接下来的代码。
$cpDB=$db->get_one("SELECT * FROM `{$pre}memberdata_1` WHERE uid='$lfjuid'");…… 省略X行。if(!$cpDB){
/*{A}*/$db->query("INSERT INTO `{$pre}memberdata_1` ( `uid` , `cpname` , `cplogo` , `cptype` , `cptrade` , `cpproduct` , `cpcity` , `cpfoundtime` , `cpfounder` , `cpmannum` , `cpmoney` , `cpcode` , `cppermit` , `cpweb` , `cppostcode` , `cptelephone` , `cpfax` , `cpaddress` ,`cplinkman`,`cpmobphone`,`cpqq`,`cpmsn`) VALUES ( '$lfjuid','$cpname','$cplogo','$cptype','$cptrade','$cpproduct','$cpcity','$cpfoundtime','$cpfounder','$cpmannum','$cpmoney','$cpcode','$cppermit','$cpweb','$cppostcode','$cptelephone','$cpfax','$cpaddress','$cplinkman','$cpmobphone','$cpqq','$cpmsn')"); $grouptype=$webdb[AutoPassCompany]?'1':'-1';
$db->query("UPDATE {$pre}memberdata SET grouptype='$grouptype' WHERE uid='$lfjuid'"); refreshto("company.php?job=edit","你的资料已经提交",1); }else{
/*{B}*/ $db->query("UPDATE {$pre}memberdata_1 SET cpname='$cpname',cplogo='$cplogo',cptype='$cptype',cptrade='$cptrade',cpproduct='$cpproduct',cpcity='$cpcity',cpfoundtime='$cpfoundtime',cpfounder='$cpfounder',cpmannum='$cpmannum',cpmoney='$cpmoney',cpcode='$cpcode',cppermit='$cppermit',cpweb='$cpweb',cppostcode='$cppostcode',cptelephone='$cptelephone',cpfax='$cpfax',cpaddress='$cpaddress',cplinkman='$cplinkman',cpmobphone='$cpmobphone',cpqq='$cpqq',cpmsn='$cpmsn' WHERE uid='$lfjuid'"); refreshto("company.php?job=edit","修改成功",1); } }
okay,看我注释为{B}的哪一行我们可以看出来,只要我们覆盖了pre变量,我们就可以执行任意update语句了,但是前提是我们必须知道原本的表前缀pre是什么。如何知道表前缀呢?有点意思的是标注为{A}的那一行。
在数据库中,`{$pre}memberdata_1`表结构中的uid是唯一的,所以只要我们覆盖掉cpDB变量,再提交一次stpe=2走到{A}所在的SQL语句,SQL就会报错并告诉我们表前缀是什么。
好了,我们看到表前缀了,那还客气什么,覆盖pre走到{B}去修改管理员的密码吧。
okay,到此为止,结束,可以把管理员密码改成12345了,这里其实update完全受你控制,你爱干什么干什么,别客气。
注意:上面的例子我故意让它报错了来截图,实际操作中可以把{}和{内的东西删除}
这里没必要用extract,你真的很想用的话可以加上EXTR_SKIP参数。
未能联系到厂商或者厂商积极拒绝
漏洞Rank:10 (WooYun评价)