SQL Injection(Blind)

您所在的位置:网站首页 安全测试怎么测试 SQL Injection(Blind)

SQL Injection(Blind)

2023-04-20 07:37| 来源: 网络整理| 查看: 265

盲注的流程:

1.找注入点

2.判断数据库长度

3.判断数据库

Low级别:

1.来到盲注,直接输入1提交后发现,没有回显数据,而是提示数据存在

1681346866_64375132326282fc26515.png!small?1681346868052

接着我们输入1'提交后发现,提示数据不存在

像这样页面不回显实际数据,只返回一种真和假的状态的就是基于布尔型的盲注

1681346907_6437515b71660f97c5d00.png!small?1681346909313

2.此时在使用基于单引号恒真的payload继续测试

1' and '1' = '1可以看到又提示数据存在了

此时SQL语句可能为select column from table where id='1' and '1' = '1'

1681347015_643751c7c282a3e1583e3.png!small?1681347017697

接着在使用1' and '1' = '0测试,又提示数据不存在了

可以确定存在基于单引号的布尔盲注

1681347064_643751f89039b24c622b6.png!small?1681347066505

3.盲注的手法和回显注入不太一样

我们只能构造语句,通过返回信息的正确与否,来判断当前语句返回的信息是否正确

所以我们可以先来判断一下数据库名的长度,构造paylaod

1'and length(database())>4#页面返回了错误说明当前数据库的库名不大于4

1681347096_643752184a8a223323d8e.png!small

既然不大于4那我们看看是否等于4,构造payload

1'and length(database())=4#可以看到页面提示数据存在了,说明当前数据库的库名长度是4

1681347129_64375239e23d188e6327b.png!small?1681347131771

4.在判断出数据库的库名长度后,我们又需要构造payload一步一步的判断出当前数据库的库名

这里我们使用left(a,b)函数,代表从左边第1位开始截取a截取b位,构造payload

1' and left(database(),1) > 'a'#判断当前数据库库名的第1个字符是否大于字符'a'

页面提示数据存在,说明库名的第一个字符确实大于'a'

1681347175_643752671d36d30ed4714.png!small?1681347176955

接着在判断第一个字符是否大于'd'

1' and left(database(),1) > 'd'#

页面返回不存在,说明当前数据库的第一个字符不大于字符d

1681347214_6437528ed2ca747dfe2b5.png!small?1681347216991

现在我们整理一下前两个条件,第一个字符大于a不大于d

说明第一个字符可能是b、c、d当中的任意一个

我们继续尝试判断第一个字符是否等于d

1' and left(database(),1) = 'd'#

页面显示存在,此时可以确定数据库的第一个字符为d

1681347267_643752c33bc02d7944aeb.png!small?1681347269308

5.接着既然是盲注,那我们就盲猜一回(主要是节省篇幅),既然玩的是dvwa靶场

数据库又是以d开头且是4位的,那有没有可能数据库的库名就是dvwa,构造payload

1' and left(database(),4) = 'dvwa'#

可以看到页面返回存在,此时就可以确定数据库的库名为dvwa了,玄学黑客从此冲出软硬两界

下面的步骤就是根据库名结合left函数和Mysql内置库构造出payload,接着猜表名、字段,数据等

1681347292_643752dc9bc8ae0cf25f3.png!small?1681347294515

Medium级别:

1.看见无框,开Bp

1681347389_6437533d412ae1b1ec300.png!small?1681347391132

提交,抓包,丢Repeater

1681347414_643753561f514b8b48c57.png!small

2.重来关闭代理关闭Bp,本着工欲善其事必先利其器的原则,我们换一个工具

这次我们使用FireFox的浏览器插件Hackbar来完成测试,从抓的包中我们可以看出

该请求是POST请求,请求参数为id=1和Submit=Submit

打开Hackbar,先点击LoadURL加载当前网页的URL,接着点击Post data填入对应的post请求参数

然后点击Execute提交数据,可以看到页面显示数据存在

1681347480_643753983b6c2424e23e7.png!small?1681347482144

3.接着我们在id参数值后面加上一个单引号测试,可以看到页面报错了

但是我们还无法判断其注入类型

1681347507_643753b3136d89b0977f5.png!small?1681347509185

继续使用基于单引号恒真payload测试

2' and '1可以看到虽然单引号引发了报错,但实际上并没有影响到原有的语句

1681347535_643753cfa1ff909a735d2.png!small?1681347537707

尝试数字型,构造payload为2 and 1可以看到页面返回ID存在了

1681347563_643753ebec2dc4d6a963e.png!small?1681347565963

我们继续测试恒假的情况,payload为2 and 0可以看到页面回显了ID is MISSING表示错误

至此我们可以看出数字型的注入会影响到页面返回的真假情况,所以可以确定是一个基于数字型的布尔盲注

1681347599_6437540f5e32f189c705a.png!small

4.确定了注入类型,我们就可以使用and length(database())>4#来判断当前数据库的库名长度是否大于4

可以看到报错了不大于41681347637_64375435199b4eb82a620.png!small?1681347639083

我们继续判断是否等于4构造payload为and length(database())=4可以看到页面回显了正确

说明当前数据库的库名长度等于4

1681347679_6437545f32e3ff2c7d928.png!small?1681347681153

5.在确定了数据库的长度我们就需要,测试库名了

使用mid(s,n,len)函数,代表截取字符串s,从n开始,截取len位构造payload为

and mid(database(),1,1) < 'z' #

代表利用mid函数截取当前数据库库名的第一个字符并判断其是否大于字符z

因为该payload比较的方式是比较两个字符的ASCII码,正常情况下所有结果都应该小于或等于'z'并返回一个正确

这里却返回了一个错误,说明此条语句可能没有生效,我们猜测它可能对字母进行了过滤

1681347728_643754905cc098697d00a.png!small?1681347730387

6.接着我们将字符'z'改为它的ASCII码122来进行比较查看,并且将字符串截取的字符也转成ASCII码payload为

id=1 and ord(mid(database(),1,1)) 100可以看到返回了错误提示,说明不大于字符d

1681347809_643754e10a396724b81bc.png!small?1681347811008

接着我们看看是否等于d,payload为

and ord(mid(database(),1,1)) = 100可以看到页面返回正确此时就可以确定数据库的第一个字符为d

接下来我们更换mid参数截取第二个字符,进行判断即可

1681347835_643754fbc03e9f93885e6.png!small?1681347837826

High级别:

1.看到无框,开启Bp,开启浏览器代理,输入1提交数据

可以看到数据是通过Cookie进行传参的,此时我们右键数据包将其发送到Repeater模块

1681347904_64375540b3b0a2ccff874.png!small?1681347906892

2.此时我们在参数后面加上单引号然后发送,可以看到响应页面返回ID不存在,说明我们输入的单引号可能影响到了系统

原有的SQL语句,我们在进一步测试

1681347957_6437557549ebfb5fe1e2a.png!small?1681347959314

构造恒真payload为1' and '1 看到页面返回ID存在

1681347990_6437559679ff358ddcfff.png!small?1681347992441

构造恒假payload为1' and '0可以看到页面返回ID不存在

此时可以确定,存在一个基于单引号的布尔盲注

1681348019_643755b3a69088992e8b9.png!small?1681348021786

2.接着我们使用length()函数判断数据库的库名长度,构造payload为1' and length(database())>4#

可以看到页面提示不存在,说明不大于4

1681348055_643755d7714f6769eb482.png!small

接着我们在查看是否等于4,paylod为1' and length(database()) =4#页面返回存在,说明当前数据库库名长度为4字节

1681348095_643755ffbbe699ce030c0.png!small?1681348098128

3.接着我们使用substr(s,n,len)函数进行测试,字符串s从n的位置开始截取len的长度,构造测试payload为

1' and substr(database(),1,1)



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3