### 简要描述: 放学回寝室,发现大家都在吐槽这个补丁。 这补丁我也是看醉了。逻辑有问题啊。。 ### 详细说明: 这是ThinkPHP对这次注入的补丁:https://github.com/liu21st/thinkphp/commit/23c6e130ce75f2132e5b48699363a75ed28e15b2 ``` }elseif(is_array($val) && isset($_REQUEST[$key]) && is_array($_REQUEST[$key])){ $options['where'][$key]=(string)$val; ``` 这逻辑…… 简单说一下他的逻辑:$key是数据库字段名字,$val是我传入的参数。 当$val是一个数组,而且$_REQUEST[$key]存在并且$_REQUEST[$key]是一个数组,则强制将我传入的参数$val转换成字符串。 可是,$_REQUEST[$key]和我传入的$val有直接关系吗? 例如 ``` $map['username'] = $_POST['name']; M('user')->where($map)->find(); ``` 这时候$key是username,但实际我传入的是$_POST['name'],是name。thinkphp的开发者是不是把两个“key”给弄混了?是被我找的onethink的例子误导了吗? 我就不找实例了,举个简单例子吧。 如果代码这样写(POST中的key和数据库的key相同,都是uname) ``` public function test() { $u = M('user')->where(array( 'uname' => I('post.uname', '', 'trim') ))->find(); dump($u); } ``` 按这个确实可以防御,可见: [<img src="https://images.seebug.org/upload/201412/122105165b3d9db0c0aeae7b9d065e0bd719b7cd.jpg" alt="01.jpg" width="600"...
### 简要描述: 放学回寝室,发现大家都在吐槽这个补丁。 这补丁我也是看醉了。逻辑有问题啊。。 ### 详细说明: 这是ThinkPHP对这次注入的补丁:https://github.com/liu21st/thinkphp/commit/23c6e130ce75f2132e5b48699363a75ed28e15b2 ``` }elseif(is_array($val) && isset($_REQUEST[$key]) && is_array($_REQUEST[$key])){ $options['where'][$key]=(string)$val; ``` 这逻辑…… 简单说一下他的逻辑:$key是数据库字段名字,$val是我传入的参数。 当$val是一个数组,而且$_REQUEST[$key]存在并且$_REQUEST[$key]是一个数组,则强制将我传入的参数$val转换成字符串。 可是,$_REQUEST[$key]和我传入的$val有直接关系吗? 例如 ``` $map['username'] = $_POST['name']; M('user')->where($map)->find(); ``` 这时候$key是username,但实际我传入的是$_POST['name'],是name。thinkphp的开发者是不是把两个“key”给弄混了?是被我找的onethink的例子误导了吗? 我就不找实例了,举个简单例子吧。 如果代码这样写(POST中的key和数据库的key相同,都是uname) ``` public function test() { $u = M('user')->where(array( 'uname' => I('post.uname', '', 'trim') ))->find(); dump($u); } ``` 按这个确实可以防御,可见: [<img src="https://images.seebug.org/upload/201412/122105165b3d9db0c0aeae7b9d065e0bd719b7cd.jpg" alt="01.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201412/122105165b3d9db0c0aeae7b9d065e0bd719b7cd.jpg) 不过如果两个key不一样: ``` public function test() { $u = M('user')->where(array( 'uname' => I('post.name', '', 'trim') ))->find(); dump($u); } ``` 继续注入啊: [<img src="https://images.seebug.org/upload/201412/12210806f386450e95a0220561eba196cc2de6a5.jpg" alt="02.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201412/12210806f386450e95a0220561eba196cc2de6a5.jpg) ### 漏洞证明: 见详情。。。