### 简要描述: rt ### 详细说明: 看到 操作数据的save函数 ``` public function save($data='',$options=array()) { if(empty($data)) { // 没有传递数据,获取当前数据对象的值 if(!empty($this->data)) { $data = $this->data; }else{ $this->error = L('_DATA_TYPE_INVALID_'); return false; } } // 分析表达式 $options = $this->_parseOptions($options); if(!isset($options['where']) ) { // 如果存在主键数据 则自动作为更新条件 if(isset($data[$this->getPk()])) { $pk = $this->getPk(); $options['where'] = $pk.'=\''.$data[$pk].'\''; $pkValue = $data[$pk]; unset($data[$pk]); }else{ // 如果没有任何更新条件则不执行 $this->error = L('_OPERATION_WRONG_'); return false; } } return $this->db->update($data,$options); } ``` 然而,在调用时 ,基本没有对 键值进行判断是否合法。 例如 修改资料处 ``` function main(){ self::is_login(); if($_POST){ $data = array_map('strval',$_POST); $data = array_map('remove_xss',$data); $data['id'] = $_SESSION['dami_uid']; M('member')->save($data); $this->success('资料保存成功~'); }else{ $info = M('member')->where('id='.$_SESSION['dami_uid'])->find(); $this->assign('info',$info);...
### 简要描述: rt ### 详细说明: 看到 操作数据的save函数 ``` public function save($data='',$options=array()) { if(empty($data)) { // 没有传递数据,获取当前数据对象的值 if(!empty($this->data)) { $data = $this->data; }else{ $this->error = L('_DATA_TYPE_INVALID_'); return false; } } // 分析表达式 $options = $this->_parseOptions($options); if(!isset($options['where']) ) { // 如果存在主键数据 则自动作为更新条件 if(isset($data[$this->getPk()])) { $pk = $this->getPk(); $options['where'] = $pk.'=\''.$data[$pk].'\''; $pkValue = $data[$pk]; unset($data[$pk]); }else{ // 如果没有任何更新条件则不执行 $this->error = L('_OPERATION_WRONG_'); return false; } } return $this->db->update($data,$options); } ``` 然而,在调用时 ,基本没有对 键值进行判断是否合法。 例如 修改资料处 ``` function main(){ self::is_login(); if($_POST){ $data = array_map('strval',$_POST); $data = array_map('remove_xss',$data); $data['id'] = $_SESSION['dami_uid']; M('member')->save($data); $this->success('资料保存成功~'); }else{ $info = M('member')->where('id='.$_SESSION['dami_uid'])->find(); $this->assign('info',$info); $this->display(); } } ``` 我们抓包添加一个 money字段 [<img src="https://images.seebug.org/upload/201501/071755599414325332fc29654ad303e2abcb855c.jpg" alt="1.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201501/071755599414325332fc29654ad303e2abcb855c.jpg) 可以看到金额变成1000000 了~ [<img src="https://images.seebug.org/upload/201501/071757146f584e36e95f3530de36496b4eb2186d.png" alt="2.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201501/071757146f584e36e95f3530de36496b4eb2186d.png) ### 漏洞证明: [<img src="https://images.seebug.org/upload/201501/071757146f584e36e95f3530de36496b4eb2186d.png" alt="2.png" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201501/071757146f584e36e95f3530de36496b4eb2186d.png)