12.6 弱 Token 设计缺陷测试
12.6.1 测试原理和方法
在找回密码功能中,很多网站会向用户邮箱发送找回密码页面链接。用户只需要进入
邮箱,打开找回密码邮件中的链接,就可以进入密码重置页面了。找回密码的链接通常会
加入校验参数来确认链接的有效性,通过校验参数的值与数据库生成的值是否一致来判断
当前找回密码的链接是否有效。
例如,网站给出的找回密码的 url 如下,单击这个链接将跳转到重置密码页面。
http://www.xxx.com/findpwd?uid=xx-uu-xx-sxx&token=1497515314
观察这个链接的参数,uid 参数可能是对应修改密码的账户,Token 就是之前提到的校
验参数了,这个参数的值看起来像一个时间戳,猜测系统生成这个 token 的机制就是使用
的时间戳。把这个值通过时间格式化后发现确实变成了日期,那么这个 Token 就是可预测
的一个时间范围的时间戳,只需要通过这个时间段就可以推测或者暴力枚举出系统生成的
时间戳值了,如图 12-27 所示。
图 12-28 时间戳转换
类似这样的弱 Token 现象有很多,比如将用户的 uid 加密成 MD5 或者 base64 编码,或者
直接用 uid+4 位随机数等这种可预测性的内容作为 Token,测试时只需要多发几个找回密码
的请求观察系统每次发送的找回密码链接中的参数值是否有规律即可。
12.6.2 测试流程
步骤一:在类似的接收凭证方式的密码找回功能中,填写邮箱或者手机号,多单击几
次发送验证信息,可以在邮箱中获得多个找回密码的凭证,如图 12-29、图 12-30 所示。
图 12-29 发送验证信息
图 12-30 接收多个找回密码邮件
图 12-31 找回密码邮件内容
步骤二:邮箱中收到多封密码找回邮件,观察链接中的密码找回凭证是否有规律可
循,以下列出几个找回密码的链接。
第一封邮件:
http://www.xxx.com/index.php?m=CustomerService&a=resetPwdEml&token=dGVz dEAxMjYuY29tJjk5NTk=
第二封邮件:
http://www.xxx.com/index.php?m=CustomerService&a=resetPwdEml&token=dGVz dEAxMjYuY29tJjI2ODI=
第三封邮件:
http://www.xxx.com/index.php?m=CustomerService&a=resetPwdEml&token=dGVz dEAxMjYuY29tJjk4NzY=
步骤三:通过对比发现 Token 参数在不断地变化,参数似乎是通过 base64 编码的,对
此可以对这三个链接中的 Token 参数做 base64 解码操作,结果如表 12-1 所示
表 12-1 解码结果
步骤四:解码后可以发现每一个 Token 的值是可以预测的,Token 的生成机制应该
是“base64 编码(用户邮箱+随机 4 位验证码)”,这样就可以通过暴力枚举获得验证码,加
上用户名再进行 base64 编码,最后得到任意用户的密码找回凭证。
12.6.3 修复建议
密码找回的 Token 不能使用时间戳或者用户邮箱和较短有规律可循的数字字符,应当
使用复杂的 Token 生成机制让攻击者无法推测出具体的值。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论