thinkphp3.2.5sql注入漏洞复现

添加测试代码,分析输入处理流程,开始debug调试。

i函数是tp框架自定义的函数,用来处理外部输入

在函数中程序会对外部输入做html转义处理,用来防范xss漏洞。

如果输入是数组,还会调用think_filter函数过滤一些关键字。

之后利用M函数指定数据表后,进入find函数。

进入_parseOptions函数。

因为输入的数组类型,直接跳过这段条件判断。(如果符合条件的的话,会对$option['where']赋值,这就是为什么payload要构造成id['where']的原因)

之后又遇到一个条件判断,这段代码里的_parseType会对$option['where']里的每个值做类型转换。但是我们的输入是字符串类型,而不是数组类型,所以跳过这段代码。

之后返回$option,并将它带入db类的select方法。

构造sql语句并执行,造成sql注入漏洞。

修复处理

官网在之后的版本对_parseOptions方法进行了修复。

在thinkphp3.2.5中。_parseOptions方法不再直接使用外部输入的$option作为实参,而是是在确认用户输入的类型为数字或字符串后,为类属性$this->options赋值并在parseOptions函数内部调用,避免了之后对parseType方法的绕过。成功预防了sql注入漏洞的发生。