freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

SQL Injection(Blind)-黑盒测试
2023-04-13 09:11:14
所属地 云南省

盲注的流程:

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)) <= 122#ord函数可以将字符转为ASCII码,而mid函数可以截取到字符

可以看到此时就返回了正确的提示信息,说明代码成功执行了

1681347762_643754b2dcc91b1ffc5cd.png!small?1681347764937

接着我们在判断其是否大于字符d,构造payload为

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) <='z'#页面返回存在,说明注入点没有对字符进行过滤

1681348123_6437561bc8e7bf7282110.png!small?1681348125837

4.接下来就可以一个字符一个字符的截取,判断了

这里为了节省篇幅,我们盲猜数据库名是dvwa,构造payload为

1‘ and substr(database(),1,4) = 'dvwa '#页面返回正确说明数据库的库名为dvwa

接下来我们就可以根据库名+内置库+截取字符串函数的方法继续判断表名,字段名,数据了

1681348167_643756478924fcae117cc.png!small












# SQL Injection(Blind) # dvwa靶场
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者