ThinkPHP5的where函数

0x00 关于thinkphp5的where函数 年前公司委托别的公司开发一个网站,使用的是ThinkPHP 5.0.13,存在一个注入漏洞,分析后发现是因为tp5中的where函数使用不当,tp5中where这个函数可以接收字符串和数组这两种类型的参数来进行查询,而在用字符串这种传递方式时,如果使用不当的话就可能会出现sql注入。 0x01 示例代码 tp5/application/home/controller/Index.php <?php namespace app\home\controller; use think\Db; class Index { //http://127.0.0.1/Source/tp5/home/index/testdb/id/1 public function testDb() { // 调用 tp5/thinkphp/library/think/Db.php 的 connect() 函数 初始化数据库,并取得数据库类实例 $msg = db('msg'); $id = input('param.id',1); //不存在id的话默认为1 //在Db.php中use think\db\Query; $msg->where()则调用了Query.php中的where函数进入查询流程 $result = $msg->where("id=".$id)->select(); // $result = $msg->where(['id'=>$id])->select(); echo '<br/><hr/>执行的sql语句:'; echo $msg->getLastSql(); echo '<br/>最终得到的结果:'; echo var_dump($result); } } where函数接收字符串和数组时,访问http://127.0.0.1/Source/tp5/home/index/testdb/id/1执行的SQL语句分别如下: SELECT * FROM `msg` WHERE ( id=1 ) SELECT * FROM `msg` WHERE `id` = 1 前者存在注入,当payload为: ) and 1=1 and (1)=(1时判断返回如下: 主要调用文件及函数顺序如下:



可以返回顶部