安全客文章报道发现Thinkphp3.2.3最新版SQL注入漏洞!还使用Thinkphp3.2.3版本的小伙伴赶紧去github上更新补丁!
漏洞详情
由于框架实现安全数据库过程中在update更新数据的过程中存在SQL语句的拼接,并且当传入数组未过滤时导致出现了SQL注入。
thinkphp系列框架过滤表达式注入多半采用I函数去调用think_filter
有没有相关tips来达到I函数绕过呢?是可以的。一般按照官方的写法,thinkphp提供了数据库链式操作,其中包含连贯操作和curd操作,在进行数据库CURD操作去更新数据的时候:举例update数据操作。
直接看框架的where子单元函数,之前网上公开的exp表达式注入就是从这里分析出来的结论:Thinkphp/Library/Think/Db/Driver.class.php其中除了exp能利用外还有一处bind,而bind可以完美避开了think_filter:
这里由于拼接了$val参数的形式造成了注入,但是这里的bind表达式会引入:符号参数绑定的形式去拼接数据,通过白盒对几处CURD操作函数进行分析定位到update函数,insert函数会造成sql注入,于是回到上面的updateh函数。
Thinkphp/Library/Think/Db/Driver.class.php
接着跟进execute函数,这里有处对$this-queryStr进行字符替换的操作:
具体是什么,我这里写了一个实例:常规的跟新数据库用户信息的操作:Application/Home/Controller/UserController.class.php
根据进来的id更新用户的名字和钱,构造一个简单一个pocid[]=bindid[]=1’money[]=user=liao当走到execute函数时sql语句为:
然后$that=$this
然后下面的替换操作是将”:0”替换为外部传进来的字符串,这里就可控了。
替换后:
明显发现之前的user参数为:0然后被替换为了liao,这样就把:替换掉了。后面的:1明显是替换不掉的:
那么我们将id[1]数组的参数变为0呢?id[]=bindid[]=0%27money[]=user=liao
果然造成了注入:POC:money[]=user=liaoid[0]=bindid[1]=0%20and%20(updatexml(1,concat(0x7e,(select%20user()),0x7e),1))
修复方式
更新最新补丁ht#tps#:/#/githu#b.