sqli-labs(三)
第五关:这关的重点是有联合查询的注入漏洞,但是页面不会显示查询信息,但是会有报错信息显示在页面上
这关是双查询注入,其实用报错注入和盲注都是可以注入的,但是我觉得这个双查询注入还是很有意思的,所以这关我们还是用双查询注入
的流程来走。
https://www.2cto.com/article/201303/192718.html
这里有篇文章讲的很不错了,我就不复述他的话了,里面有一句很重要:简单的一句话原理就是有研究人员发现,当在一个聚合函数,比如count函数后面如果使用分组语句就会把查询的一部分以错误的形式显示出来。
第一步:依然是使用order by判断表的列数
第二部:输入
id=1'%20union%20select%20count(*),concat((select%20user()),floor(rand()*2))%20as%20a,count(*)%20from%20information_schema.schemata%20group%20by%20a%23
比较长,不急,慢慢解释:主体依然是id=1' union select 1,2,3 from information_schema.schemata #
只不过这里讲1,2,3分别替换成了聚合函数,然后再后面加了个group by ,至于原因就是我们上面所提到的很重要的一句话(简单的一句话原理就是有研究人员发现,当在一个聚合函数,比如count函数后面如果使用分组语句就会把查询的一部分以错误的形式显示出来。)
这里的a是我们给concat((select%20user()),floor(rand()*2))起的一个别名(利用as)
rand()取0到1的随机值,floor()取整 ,这样的话使用concat将子查询(select user())的结果与0或1进行拼凑,组成xxx0或xxx1,所以结果是变化的。至于这样做的原因是为了让后面可以进行分组(也就是可以使用group by)。
现在知道整句话的意思后就可以进行后面的操作了,只需要将子查询换成其他的查询操作。
第三步:查询出所有的数据库名
http://localhost/sqli-labs-master/Less-5/
?id=1'%20union%20select%20count(*),concat((select%20schema_name%20from%20information_schema.schemata%20limit%201,1),floor(rand()*2))%20as%20a,count(*)%20from%20information_schema.schemata%20group%20by%20a%23
值得注意的是,子查询中不能使用group_concat了,不然就不会报错了,只能使用limit 来一行一行的查询
后面的查询表名,字段名以及数据内容的步骤我就不进行了,和前面几关一样
第六关:
和第五关是一样的,只不过将单引号换成了双引号