目录
一、知识点概述
二、找回密码过程中涉及到的安全问题
三、案例演示
<验证码回显>
<修改Response状态值>
<验证码爆破>
四、真实案例1
<更改状态值>
<验证码接口调用>
五、真实案例2
<用户名重定向>
六、安全修复方案
一、知识点概述
- 找回密码逻辑机制-回显&验证码&指向。
- 验证码验证安全机制-爆破&复用&识别。
- 找回密码-客户端回显&Response 状态值&修改重定向。
- 验证码技术-验证码爆破,验证码复用,验证码识别等。
二、找回密码过程中涉及到的安全问题
- 用回显状态判断-res 前端判断不安全。
- 用用户名重定向-修改标示绕过验证。
- 验证码回显显示-验证码泄漏验证虚设。
- 验证码简单机制-验证码过于简单爆破。
三、案例演示
<验证码回显>
1.打开目标站点,输入账号和密码后点击登陆。
2.登陆后可以看到下面的信息,点击账户绑定。
3. 进入到了下面的页面,点击绑定手机号。
4.填写手机号后进行抓包。
5.抓到的数据包如图所示。
6.此时将数据包放出,可以看到验证码已经发送了,但是没发送到我们的手机上来(那个手机号是虚构的不知道是谁的)。
7.我们随便输入验证码”123456”然后抓取数据包。
8.数据包如下所示。
9.可以看到数据包内有一个选项,下图中红色框出部分,这部分就是验证码。
10.我们将其粘贴到下面我们刚刚随便猜解的验证码的位置,然后放包。
11.可以看到网站内提示“手机绑定成功”。
12.这就是第一种情况——验证码的回显。
<修改Response状态值>
13.我们再次将其解绑来讲解另一种方式。
14.点击“立即绑定”。
15. 再按照前面的操作使验证码进行回显。
16.我们对数据包进行下面的操作,这个操作就是使得回显值也会发送到burp里。
17.选择上面的选项后我们放包。可以看到得到了回显数据包,其值为“3”。
18.如果将此数据包放出去,网站内就会提示验证码不正确。
19.那么我们此时就大概知道了“3”就是验证码不正确。
20.我们再采取上面的方式,但是将正确的验证码填入,可以看到返回值是“1”。
21.此时我们放包就可以看到手机绑定成功。
22.因此可以猜想,利用此方式,就可以不用理会验证码正不正确,只需要更改返回包内的数字网站内即可返回成功绑定。
23.但是我们还不能确定是否真的绑定成功了,因为我们更改的仅仅是浏览器接收的值。到底成不成功不是以浏览器的返回值为准,而是要看服务器是否会例会这个值,如果服务器不理就不会真的绑定成功。
24.我们通过将其值从3更改到1的方法绑定后,刷新页面查看。
25.可以看到刚刚网站虽然提示绑定成功了,但是这里却并没有真的绑定成功。
26. 这就说明到底有没有绑定成功,是通过服务端确定的,而不是通过返回的状态码确定的。
27.所以这种攻击的实现需要网站是根据前端来进行验证的,而不能是通过服务端验证的。
28.这就是另一种情况——修改Response状态值,res前端判断不安全。
<验证码爆破>
29.我们再来讲解另一种方式。
30.首先再次抓取数据包。
31. 这里是6位纯数字验证码,就存在1,000,000种可能的组合方式。
32.在我们提交验证码的时候,如果网站对提交的次数没有要求,那么这里就存在爆破的可能性。
33.右击鼠标后选择下面的选项。
34. 接下来来到下图的位置。
35. 首先点击清除。
36.将下图所示位置选中后点击“add”。
37.来到下图位置。
38. 选择“Numbers”。
39. 为了节省时间我们将下面的配置设置成如下图所示。
40. 进行下面操作后开始发送数据包。
41. 可以看到正确验证码的数据包内值为1,而其它错误的均为3。
42.这就是另一种情况——对验证码没有实施安全措施,可以进行爆破获取。
四、真实案例1
<更改状态值>
1.打开目标软件。
2.进入软件。
3. 点击“我的”,然后点击“登陆/注册”。
4. 假如说我们要重置个人密码,点击“忘记密码”。
5. 将相关信息输入后点击“获取”,获取验证码。
6.抓取到下图所示的验证码。
7. 对数据包进行简要分析
8.我们对上面的md5加密的字符串进行解密,但是返回未查到,那么就先不理会它。
9.我们先将数据包放出去,然后在填写验证的位置随便填写验证码。
10. 点击下一步后抓取数据包。
11. 但是在数据包被并没有发现验证码的踪影,说明其前端显示是没有的。
12.那么我们就可以想到能不能通过修改状态来绕过呢。
13.因此此时我们需要换一个我们自己的账号,来进行修改密码,获取数据包来观察数据包特征。
14.输入得到的正确的验证码。
15.抓取数据包后选择下面的选项来抓取其回显数据包。
16. 放包后可以看到验证成功的状态。
17.将成功的状态码和失败的状态码放在一起方便进行对比。
18.再次随便输入验证码,然后抓取返回数据包。
19.将刚刚复制下来的成功的状态码替换掉失败的状态码。
20. 放包后可以看到成功验证了,然后跳转到了修改密码的界面。
21. 输入密码点击确定后抓取数据包。
22.抓取到的数据包如下图所示。
23. 将这个数据包发送出去后提示密码重置成功。
<验证码接口调用>
24.打开目标软件,在修改密码这里存在验证码发送的接口,当我们点击获取后,其就会给我们发送一条验证码。
25.我们点击获取验证码后抓取数据包。
26. 如果这个数据包放出之后,其就会发送验证码。
27.将数据包发送到“Repeater”,点击一次放包,可以看到验证码成功发送了。
27.至此我们想到如果不断的去发送数据包时的两个问题:
- 不断放包,会不会不断给我们发送验证码。
- 正常的安全的图形验证码每次我们点击一次获取之后,其都应该刷新一次,并且就算图形化验证码输入的正确,发送验证码也要有时间间隔,短信轰炸的原理就在此。
正确设计:
获取:判断图像验证码是否正确。
————防机器,确保人工
获取:每一分钟才能触发一次发送验证码。
————防止乱用(短信轰炸)
28.我们利用上面抓取到的数据包重复发送,发现每次放包之后,都会成功将验证码发送。这里接口不断被调用,验证码就不断被发送。
29.扩展:
后台猜密码:
- 验证码提交猜解-复用(验证码等于没有)
- 不存在复用-(验证码识别)
这里推荐两个验证码识别插件:
-
https://github.com/c0ny1/captcha-killer
-
https://github.com/smxiazi/NEW_xp_CAPTCHA
五、真实案例2
<用户名重定向>
——海洋CMS
1.打开目标网站。
2.来到注册页面,输入注册信息后进行账户注册,注册两个账户。
3.来到找回密码的页面。
4. 我们会受到如下所示的邮件,里面包含重置密码的链接。
5. 打开链接就来到了重置密码的界面。
6.其核心就在接收的邮件里的找回密码的链接里。
7.我们尝试将链接末尾的“1”,改成“2”,然后进行访问,来尝试其会不会修改2的密码。
8. 但是结果是失败的,它返回了下面的页面。
9. 我们注意到这个值,这个值类似于身份验证。
10.我们结合其原码进行分析,可以看到其会与数据库内存储的信息进行比对。
11.查询数据库后我们将其进行对应的修改,访问后发下成功可以更改2的密码了。
12.那么就会产生一个问题,如果不查看数据库,那么怎么知道那个值是y呢?
答:其实如果你再注册一个账户就可以发现,每次新注册的用户的那个值都是默认固定的y,当找回过密码之后才会发生变化。
13.总结:
这就是利用用户名的重定向,实现对任意用户密码的修改。
六、安全修复方案
- 找回机制要进行每一步验证-防绕过重定向。
- 找回机制要进行服务端验证-防res数据修改。
- 找回机制要控制验证码安全-防验证码攻击。
- 验证码接口需验证后被调用-防接口被乱调用。
- 验证码引用智能化人工判断-防验证码被识别。
- 验证码采用时间段生效失效-防验证码被复用。