当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2012-015364

漏洞标题:躺在床上读代码之 php168分类系统之SQL注射修改管理员密码

相关厂商:PHP168

漏洞作者: 快点啊!!

提交时间:2012-11-28 14:24

修复时间:2013-01-12 14:25

公开时间:2013-01-12 14:25

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:未联系到厂商或者厂商积极忽略

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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就会报错并告诉我们表前缀是什么。


php168_1.jpg


好了,我们看到表前缀了,那还客气什么,覆盖pre走到{B}去修改管理员的密码吧。


php168_2.jpg


okay,到此为止,结束,可以把管理员密码改成12345了,这里其实update完全受你控制,你爱干什么干什么,别客气。

注意:上面的例子我故意让它报错了来截图,实际操作中可以把{}和{内的东西删除}


漏洞证明:

php168_2.jpg


okay,到此为止,结束,可以把管理员密码改成12345了,这里其实update完全受你控制,你爱干什么干什么,别客气。

注意:上面的例子我故意让它报错了来截图,实际操作中可以把{}和{内的东西删除}


修复方案:

这里没必要用extract,你真的很想用的话可以加上EXTR_SKIP参数。

版权声明:转载请注明来源 快点啊!!@乌云


漏洞回应

厂商回应:

未能联系到厂商或者厂商积极拒绝

漏洞Rank:10 (WooYun评价)