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

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

缺陷编号:wooyun-2015-096716

漏洞标题:Iwebshop 最新版SQL注入漏洞

相关厂商:jooyea.net

漏洞作者: 路人甲

提交时间:2015-04-07 11:26

修复时间:2015-07-06 11:56

公开时间:2015-07-06 11:56

漏洞类型:SQL注射漏洞

危害等级:中

自评Rank:10

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

Iwebshop 最新版SQL注入漏洞

详细说明:

看到iwebshop在2015.01.26又更新了(v3.0.15011000),看了看更新说明,说已经修改了wooyun上的漏洞,就下下来看看是怎么修复的吧。
注入一枚:POST /index.php?controller=block&action=filter_user POST参数中search作为数组传入,在过滤时只对value作了过滤,但是key并没有过滤,造成注入。
看看代码/controllers/block.php

public function filter_user()
{
$where = '';
$userIds = '';
$search = IFilter::act(IReq::get('search')); //这里只对value作了过滤,而key没有过滤
foreach($search as $key => $val)
{
if($val)
{
$where .= $key.'"'.$val.'"';
}
}
//有筛选条件
if($where)
{
$userDB = new IQuery('user as u');
$userDB->join = 'left join member as m on u.id = m.user_id';
$userDB->fields= 'u.id';
$userDB->where = $where;
$userData = $userDB->find();
$tempArray = array();
foreach($userData as $key => $item)
{
$tempArray[] = $item['id'];
}
$userIds = join(',',$tempArray);
if(!$userIds)
{
die('<script type="text/javascript">alert("没有找到用户信息,请重新输入条件");window.history.go(-1);</script>');
}
}
die('<script type="text/javascript">parent.searchUserCallback("'.$userIds.'");</script>');
}


$search = IFilter::act(IReq::get('search')); 再去看看IFilter::act
/lib/core/util/filter_class.php

/**
* @brief 对字符串进行过滤处理
* @param string $str 被过滤的字符串
* @param string $type 过滤数据类型 值: int, float, string, text, bool, url
* @param int $limitLen 被输入的最大字符个数 , 默认不限制;
* @return string 被过滤后的字符串
* @note 默认执行的是string类型的过滤
*/
public static function act($str,$type = 'string',$limitLen = false)
{
if(is_array($str))
{
foreach($str as $key => $val)
{
$resultStr[$key] = self::act($val, $type, $limitLen);
}
return $resultStr;
}
else
{
switch($type)
{
case "int":
return intval($str);
break;
case "float":
return floatval($str);
break;
case "text":
return self::text($str,$limitLen);
break;
case "bool":
return (bool)$str;
break;
case "url":
return self::clearUrl($str);
break;
case "filename":
return self::fileName($str);
break;
default:
return self::string($str,$limitLen);
break;
}
}
}


因为在获取search时,$search = IFilter::act(IReq::get('search')); act()没有指定第二个类型参数,默认是字符串过滤单引号。但是当被过滤的对象为数组时,只对value作了过滤,对key没有过滤,造成了注入。
Payload:POST提交

payload.JPG


因为是time-based blind 注入,猜测管理员用户名的第一个字母时,若错误,延迟2s左右,如下图

猜测失败副本.jpg


若正确,延迟3s左右,如下图

猜测成功副本.jpg


按上面的方法依次做下去(burp intruder或者自己写个脚本跑),可测试管理员用户名为:admin,密码为: f6fdffe48c908deb0f4c3bd36c032e72

漏洞证明:

见 详细说明

修复方案:

过滤

版权声明:转载请注明来源 路人甲@乌云


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:10

确认时间:2015-04-07 11:54

厂商回复:

感谢测试

最新状态:

暂无