PHITHON的公开漏洞ThinkPHP补丁修复不当导致SQL注入 2016-09-06
ThinkPHP补丁修复不当导致SQL注入
放学回寝室,发现大家都在吐槽这个补丁。
这补丁我也是看醉了。逻辑有问题啊。。
这是ThinkPHP对这次注入的补丁:https://github.com/liu21st/thinkphp/commit/23c6e130ce75f2132e5b48699363a75ed28e15b2
1 | }elseif(is_array($val) && isset($_REQUEST[$key]) && is_array($_REQUEST[$key])){ |
这逻辑……
简单说一下他的逻辑:$key
是数据库字段名字,$val
是我传入的参数。
当$val
是一个数组,而且$_REQUEST[$key]
存在并且$_REQUEST[$key]
是一个数组,则强制将我传入的参数$val
转换成字符串。
可问题是,$_REQUEST[$key]
和我传入的$val
有直接关系吗?
例如
1 | $map['username'] = $_POST['name']; |
这时候$key
是username,但实际我传入的是$_POST['name']
,是name。thinkphp的开发者是不是把两个“key”给弄混了?是被我找的onethink的例子误导了吗?
我就不找实例了,举个简单例子吧。
如果代码这样写(POST中的key和数据库的key相同,都是uname)
1 | public function test() |
按这个确实可以防御,可见:
不过如果两个key不一样:
1 | public function test() |
继续注入啊: