
盲注的流程:
1.找注入点
2.判断数据库长度
3.判断数据库
Low级别:
1.来到盲注,直接输入1提交后发现,没有回显数据,而是提示数据存在
接着我们输入1'提交后发现,提示数据不存在
像这样页面不回显实际数据,只返回一种真和假的状态的就是基于布尔型的盲注
2.此时在使用基于单引号恒真的payload继续测试
1' and '1' = '1
可以看到又提示数据存在了
此时SQL语句可能为select column from table where id='1' and '1' = '1'
接着在使用1' and '1' = '0
测试,又提示数据不存在了
可以确定存在基于单引号的布尔盲注
3.盲注的手法和回显注入不太一样
我们只能构造语句,通过返回信息的正确与否,来判断当前语句返回的信息是否正确
所以我们可以先来判断一下数据库名的长度,构造paylaod
1'and length(database())>4#
页面返回了错误说明当前数据库的库名不大于4
既然不大于4那我们看看是否等于4,构造payload
1'and length(database())=4#
可以看到页面提示数据存在了,说明当前数据库的库名长度是4
4.在判断出数据库的库名长度后,我们又需要构造payload一步一步的判断出当前数据库的库名
这里我们使用left(a,b)函数,代表从左边第1位开始截取a截取b位,构造payload
1' and left(database(),1) > 'a'#
判断当前数据库库名的第1个字符是否大于字符'a'
页面提示数据存在,说明库名的第一个字符确实大于'a'
接着在判断第一个字符是否大于'd'
1' and left(database(),1) > 'd'#
页面返回不存在,说明当前数据库的第一个字符不大于字符d
现在我们整理一下前两个条件,第一个字符大于a不大于d
说明第一个字符可能是b、c、d当中的任意一个
我们继续尝试判断第一个字符是否等于d
1' and left(database(),1) = 'd'#
页面显示存在,此时可以确定数据库的第一个字符为d
5.接着既然是盲注,那我们就盲猜一回(主要是节省篇幅),既然玩的是dvwa靶场
数据库又是以d开头且是4位的,那有没有可能数据库的库名就是dvwa,构造payload
1' and left(database(),4) = 'dvwa'#
可以看到页面返回存在,此时就可以确定数据库的库名为dvwa了,玄学黑客从此冲出软硬两界
下面的步骤就是根据库名结合left函数和Mysql内置库构造出payload,接着猜表名、字段,数据等
Medium级别:
1.看见无框,开Bp
提交,抓包,丢Repeater
2.重来关闭代理关闭Bp,本着工欲善其事必先利其器的原则,我们换一个工具
这次我们使用FireFox的浏览器插件Hackbar来完成测试,从抓的包中我们可以看出
该请求是POST请求,请求参数为id=1和Submit=Submit
打开Hackbar,先点击LoadURL
加载当前网页的URL,接着点击Post data
填入对应的post请求参数
然后点击Execute
提交数据,可以看到页面显示数据存在
3.接着我们在id参数值后面加上一个单引号测试,可以看到页面报错了
但是我们还无法判断其注入类型
继续使用基于单引号恒真payload测试
2' and '1
可以看到虽然单引号引发了报错,但实际上并没有影响到原有的语句
尝试数字型,构造payload为2 and 1
可以看到页面返回ID存在了
我们继续测试恒假的情况,payload为2 and 0
可以看到页面回显了ID is MISSING表示错误
至此我们可以看出数字型的注入会影响到页面返回的真假情况,所以可以确定是一个基于数字型的布尔盲注
4.确定了注入类型,我们就可以使用and length(database())>4#
来判断当前数据库的库名长度是否大于4
可以看到报错了不大于4
我们继续判断是否等于4构造payload为and length(database())=4
可以看到页面回显了正确
说明当前数据库的库名长度等于4
5.在确定了数据库的长度我们就需要,测试库名了
使用mid(s,n,len)
函数,代表截取字符串s,从n开始,截取len位构造payload为
and mid(database(),1,1) < 'z' #
代表利用mid函数截取当前数据库库名的第一个字符并判断其是否大于字符z
因为该payload比较的方式是比较两个字符的ASCII码,正常情况下所有结果都应该小于或等于'z'并返回一个正确
这里却返回了一个错误,说明此条语句可能没有生效,我们猜测它可能对字母进行了过滤
6.接着我们将字符'z'改为它的ASCII码122来进行比较查看,并且将字符串截取的字符也转成ASCII码payload为
id=1 and ord(mid(database(),1,1)) <= 122#
ord函数可以将字符转为ASCII码,而mid函数可以截取到字符
可以看到此时就返回了正确的提示信息,说明代码成功执行了
接着我们在判断其是否大于字符d,构造payload为
and ord(mid(database(),1,1)) > 100
可以看到返回了错误提示,说明不大于字符d
接着我们看看是否等于d,payload为
and ord(mid(database(),1,1)) = 100
可以看到页面返回正确此时就可以确定数据库的第一个字符为d
接下来我们更换mid参数截取第二个字符,进行判断即可
High级别:
1.看到无框,开启Bp,开启浏览器代理,输入1提交数据
可以看到数据是通过Cookie进行传参的,此时我们右键数据包将其发送到Repeater模块
2.此时我们在参数后面加上单引号然后发送,可以看到响应页面返回ID不存在,说明我们输入的单引号可能影响到了系统
原有的SQL语句,我们在进一步测试
构造恒真payload为1' and '1 看到页面返回ID存在
构造恒假payload为1' and '0
可以看到页面返回ID不存在
此时可以确定,存在一个基于单引号的布尔盲注
2.接着我们使用length()函数判断数据库的库名长度,构造payload为1' and length(database())>4#
可以看到页面提示不存在,说明不大于4
接着我们在查看是否等于4,paylod为1' and length(database()) =4#页面返回存在,说明当前数据库库名长度为4字节
3.接着我们使用substr(s,n,len)函数进行测试,字符串s从n的位置开始截取len的长度,构造测试payload为
1' and substr(database(),1,1) <='z'#
页面返回存在,说明注入点没有对字符进行过滤
4.接下来就可以一个字符一个字符的截取,判断了
这里为了节省篇幅,我们盲猜数据库名是dvwa,构造payload为
1‘ and substr(database(),1,4) = 'dvwa '#
页面返回正确说明数据库的库名为dvwa
接下来我们就可以根据库名+内置库+截取字符串函数的方法继续判断表名,字段名,数据了
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)