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

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

缺陷编号:wooyun-2014-081437

漏洞标题:qibocms 地方门户系统 注入#6 & 另外一处变量覆盖的地方。(demo测试)

相关厂商:齐博CMS

漏洞作者: ′雨。

提交时间:2014-10-31 12:22

修复时间:2015-01-29 12:24

公开时间:2015-01-29 12:24

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-10-31: 细节已通知厂商并且等待厂商处理中
2014-10-31: 厂商已经确认,细节仅向厂商公开
2014-11-03: 细节向第三方安全合作伙伴开放
2014-12-25: 细节向核心白帽子及相关领域专家公开
2015-01-04: 细节向普通白帽子公开
2015-01-14: 细节向实习白帽子公开
2015-01-29: 细节向公众公开

简要描述:

这变量覆盖比较不应该了。

详细说明:

在/hy/member/homepage_ctrl/pic_upload.php中

if($step==2){
if(!$psid){
showerr('请选择一个图集!');
}
$ck=0;

foreach($photoDB[url] AS $key=>$value){ //对$photoDB[url]数组循环出来
if(!eregi("\.(gif|jpg|jpeg|png|bmp)$",$value)){
delete_attachment($uid,tempdir($value));
continue;
}

$picpath = "homepage/pic/".ceil($uid/1000)."/";
$picurl = $picpath.basename($value);

move_attachment($uid,tempdir($value),$picpath); //图片转移目录与加水印
if(!is_file(ROOT_PATH."$webdb[updir]/$picurl")){
$picurl=$value;
}

$Newpicpath=ROOT_PATH."$webdb[updir]/{$picurl}.gif";
gdpic(ROOT_PATH."$webdb[updir]/$picurl",$Newpicpath,150,150);
if(!is_file($Newpicpath)){
copy(ROOT_PATH."$webdb[updir]/{$picurl}",$Newpicpath);
}
$title = filtrate($photoDB[name][$key]);//刚才是$photoDB[url] 现在是photoDB[name]
所以这个 photoDB[name] 我们就可以不用提交数组了 提交一个字符串。
所以又是截取字符了。
用filtrate处理了一下 不过关系不大
$title = get_word($title,32);//这里截取32个字符 这里不影响

$db->query("INSERT INTO `{$_pre}pic` (`psid` , `uid` , `username` , `title` , `url` , `level` , `yz` , `posttime` , `isfm` , `orderlist` ) VALUES ('$psid', '$uid', '$lfjid', '$title', '$picurl', '0', '1', '$timestamp', '0', '0')");// 把$title 带入查询 在$title后的$picurl 是
$picurl = $picpath.basename($value); 数组中循环中的value 限制了必须为jpg结尾 不用考虑 注释掉就行 basename 无影响
$ck++;
}


这个先注册个会员 然后开个店铺。

q3.jpg


出数据
demo测试

q4.jpg


____________________________________________________________________
一处变量覆盖
在shop/inc/join.inc.php中
像qibocms这种伪全局机智的cms 一般都会禁止创建GLOBALS变量
而qibocms却没有禁止
在shop/inc/join/inc.php中

function join_set(){
extract($GLOBALS); //这里我们直接创建GLOBALS 然后变量覆盖掉$_pre
global $address_select,$rsdb,$listdb;
$address_select = '';/*
if(!is_table("{$_pre}address")){
$db->query("CREATE TABLE `{$_pre}address` AS ( SELECT * FROM `{$_pre}content_2`);");
$db->query("ALTER TABLE `{$_pre}address` ADD PRIMARY KEY ( `rid` );");
$db->query("ALTER TABLE `{$_pre}address` CHANGE `rid` `rid` MEDIUMINT( 7 ) NOT NULL AUTO_INCREMENT ;");
$db->query("ALTER TABLE `{$_pre}address` ADD INDEX ( `uid` );");
$db->query("TRUNCATE TABLE `{$_pre}address`;");
$db->query("ALTER TABLE `{$_pre}address` DROP `id` ,DROP `fid` ,DROP `content` ,DROP `order_sendtype` ,DROP `order_paytype` ;");
}*/
if($job!='edit'){
$rsdb[order_username] = $lfjdb[truename];
$rsdb[order_phone] = $lfjdb[telephone];
$rsdb[order_mobphone] = $lfjdb[mobphone];
$rsdb[order_email] = $lfjdb[email];
$rsdb[order_qq] = $lfjdb[oicq];
$rsdb[order_postcode] = $lfjdb[postalcode];
$rsdb[order_address] = $lfjdb[address];

$query = $db->query("SELECT * FROM `{$_pre}address` WHERE uid='$lfjuid'");
while($rs = $db->fetch_array($query)){
$address_select.="<option value='$rs[rid]'>地址:{$rs[order_address]} 联系人:{$rs[order_username]} 电话:{$rs[order_mobphone]}</option>";

}


输出一下GLOBALS

q5.jpg


q6.jpg


直接又创建了GLOBALS 结合这里的extract 直接变量覆盖
这里我们来输出一下表前缀

q7.jpg


覆盖掉

q8.jpg


成功覆盖掉表前缀。

漏洞证明:

q3.jpg

修复方案:

第一个判断是不是数组
第二个 禁止创建GLOBALS

版权声明:转载请注明来源 ′雨。@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2014-10-31 15:08

厂商回复:

感谢提出来!

最新状态:

暂无