[强网杯 2019]随便注
前言
个人观点,若有误请指教
解题思路及步骤
-
直接上’引号,结果直接报错了,证明存在sql注入漏洞。
-
判断当前表一共有几列,可得一共两列
-
获得当前表的内容,很明显当前表没有flag
注:是不是很蒙?竟然可以直接获得当前表的内容,那我干嘛还要在上面测试表有多少列?其实不是的,你在网页看到一共有几列就证明在数据库中的当前表就只有几列吗?就不能少几列给你看?当然,这道确实显示的列数和在数据库的当前表的列数一样。 -
尝试联合查询(union),关键词被过滤了
-
至此本人蒙圈了,不知怎解,上网查答案吧🤡。
-
测试是否存在堆叠注入,顺便查一下所有的数据库名
注:存在堆叠注入 -
查询当前数据库的表名
-
查看当前数据库的两个表结构,使用desc命令(desc除了降序排列的功能外,还可以查看表结构噢)
注:在windows系统下,反单引号 ` 是数据库、表、索引、列和别名用的引用符。也就是说在写表名时应该都加反单引号,但在查words的时候却没有加也能查出来(words加的话也是可以查出来的,而1919810931114514表必须加,不然查不出来),这一点有点奇怪,根据这道题来推测一下吧,只要是全数字的都要反单引号不然查不出来,不是的可加不可加。反正到底是不是影响不大,遇到可以堆叠注入的时候都试一下就好了。 -
根据上面查询结果,很快可以推断sql语句查询的表是words,而flag在1919810931114514表中,这时候由于后台的sql语句是固定的,所以我们需要将1919810931114514改为words表(原words改成其他名),把列名flag改为id。
//构造payload,记得合起来一起输入
0';
#改变表名
rename table words to words1;
rename table `1919810931114514` to words;
#改列名
alter table words change flag id varchar(100);
#查询表
desc words;#
总结
- 堆叠注入原理
在sql中,分号表示一条语句的结束。我们就可以构造以下的模板,以至于可以在一次数据库的调用中执行多个语句。
//记得要加#,因为鬼知道后面有没有东西,干脆加上了事
语句; 语句; ··· 语句; #
-
堆叠注入的局限性(了解一下)
堆叠注入并不是在每种情况下都能使用的。大多数时候,因为API(应用程序接口)或数据库引擎的不支持,堆叠注入都无法实现。 -
若题目过滤了太多关键词,极有可能存在堆叠注入!