声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!
常见的密码找回方式有:
l 邮箱找回
l 手机验证码找回
l 密码保护问题找回等
这些常见的找回方式会存在哪些安全问题呢?今天主要来说说密码找回功能有哪些测试点及对应的测试方法。
密码找回功能安全测试点,主要包含以下9个点:
1. 用户名枚举
2. 绕过密码找回步骤
3. 邮箱验证
4. Cookie混淆
5. 覆盖注册
6. 图形验证码
7. 短信验证码
8. 输入输出
9. 密保问题
No.1
用户名枚举
渗透思路:根据验证用户名时返回的信息判断网站是否存在对应的用户,进行用户名枚举,获取对应网站的用户名字典。
测试方法:
(1) 输入已知存在的用户名,获取其返回的内容;
(2) 输入不存在的用户名,获取其返回的内容;
(3) 对比(1)和(2)两次返回内容的差异性,比如(1)返回“验证成功”,(2)返回“用户不存在”;
(4) 根据差异,直接对用户名进行遍历,返回与(1)内容相同的,则说明存在。
举例:
(1) 进入找回密码页面,输入账户名和验证码;
(2) 当用户存在时,响应提示“查询成功”;
(3) 当用户不存在时,响应提示“未找到对应用户”;
(4) 根据(2)和(3)响应内容的不同,对用户名的参数值进行遍历,根据响应内容不同,返回长度不同,判断是否存在,从而获取对应的用户名字典。
子弹观点
针对此类问题,一般修复建议:
(1) 增加防自动化攻击的措施,如增加图形验证码(需一次有效)或手机验证码(需一次有效)等。
(2) 限制单位时间内同一IP验证用户名的次数,如同一IP在5分钟内仅允许验证5次用户名是否存在。
No.2
绕过密码找回步骤
渗透思路:
跳过原有密码找回步骤中的1/2步进行测试,查看是否能够成功找回。
测试方法一
(1) 进行正常的密码找回,获取每一步请求的URL;
(2) 跳过注册步骤中的一步或者两步,直接访问记录的设置新密码请求,尝试是否找回成功。
测试方法二
直接通过修改元素的方法,跳过密码找回步骤中的一步或者两步,尝试是否找回成功。
举例:
(1) 通过观察,发现该网站找回密码的步骤分为4步,输入需要找回的账号昵称,点击下一步,进入第二步“选择找回方式”;
(2) 通过修改元素的方法,删除第三步“设置新密码”元素style的“display:none”,删除后即出现设置新密码页面;
(3) 输入新密码后,点击确定,即设置成功。
子弹观点
业务逻辑顺序执行绕过是一种很常见的场景,一般修复建议:
(1) 每一个步骤都要对前一个步骤的处理结果进行验证;
(2) 提交新密码时应对当前用户名、手机号、短信验证码进行二次匹配验证。
No.3
邮箱验证
渗透思路:
(1) 邮箱功能滥用:测试短时间内是否可以大量触发发送邮件功能,从而形成邮件轰炸。
(2) 不同账号找回链接可复用:账号A进行密码找回的链接,账号B可以直接使用,并且能够找回成功。
(3) 找回密码token可预测:找回密码链接中的token值为一串有规律性的可以预测的字符,根据其规律性,就可以进行任意用户的密码重置。
(4) 未验证邮箱与账号之间的对应关系:账号A密码找回的链接可以发送到非绑定的邮箱,并成功找回。
(5) 同一账号找回链接永久有效:账号A月初找回密码的链接,月末甚至更长时间都可以直接使用进行密码的找回。
(6) 邮箱验证码的值在响应中返回:用户找回密码的验证码,在发送短信验证码请求的响应中返回。
测试方法
(1) 邮箱功能滥用:使用邮箱验证功能进行密码找回时,发送邮件功能无防自动化攻击措施(无图形验证码或图形验证码多次有效,未限制单位时间触发邮件的次数),直接使用工具多次触发发送邮件功能。针对此类问题,修复建议是增加防自动化攻击措施(图形验证码一次有效,限制单位时间触发邮件的次数)。
(2) 不同账号找回链接可复用:账号A进行使用邮箱密码找回的操作,获取找回链接后,B账号直接使用该链接进行密码找回,设置新密码成功。针对此类问题,修复建议是验证找回链接与账号之间的对应关系。
(3) 找回密码token可预测:找回密码链接中的token值为一串有规律性的可以预测的字符(如时间戳、用户id等),根据其规律性,就可以进行任意用户的密码重置。针对此类问题,修复建议是token设置为随机数,或进行加密处理(MD5+SALT)。
(4) 未验证邮箱与账号之间的对应关系:账号A进行密码找回时,抓包替换绑定的邮箱为其他邮箱账号,发送邮件成功,且使用该链接可以成功进行密码找回。针对此类问题,修复建议是验证邮箱与账号之间的对应关系。
(5) 同一账号找回链接永久有效:账号A进行密码找回一个月后,密码再次忘记,使用之前找回密码的链接进行密码找回,成功找回。针对此类问题,修复建议是设置找回链接的有效期,如8小时,且一次有效。
(6) 邮箱验证码的值在响应中返回:用户找回密码的发送邮件的验证码,直接在请求响应中返回。针对此类问题,修复建议是验证码直接不在前端返回。
以邮箱功能滥用为例:
(1) 找回密码处输入找回的邮箱,点击发送邮件,抓包拦截请求;
(2) 批量触发该请求后,返回邮箱查看,发现收到多条邮件。
子弹观点
很多企业还在大量使用邮箱验证找回密码,目前已知的有6种场景问漏洞,最常见的找回密码token可预测,本质上我们在设计邮箱找回密码的时候没有统一的机制,导致做法很多,漏洞百出,所以建议使用手机短信码来找回密码,安全系数会更高。
No.4
Cookie混淆
渗透思路:同一浏览器进行不同账号的密码找回。
测试方法:
A账号通过用户名验证、手机/邮箱验证后,进入新密码设置页面,在同一个浏览器进行B账号的密码找回,B账号通过用户名验证后,直接回到用户A新密码设置页面,输入密码提交后,B账号密码设置成功。
举例:
(1) 用户A进行密码找回,验证账号后,进入验证身份环节,输入手机号和正确的验证码;
(2) 进入第三步重置密码环节;
(3) 在同一个浏览器,再次进行用户B的密码找回,输入用户B的账号;
(4) 验证通过后,进入第二步验证身份的环节;
(5) 不输入验证码,返回用户A重置密码环节,输入密码,提交,用户B密码重置成功。
子弹观点
针对此类问题,只需在提交新密码时对当前用户名、手机号、短信验证码进行二次匹配验证即可。
No.5
覆盖注册
渗透思路:
直接使用已注册的用户名/手机号/邮箱进行注册,注册成功后,即相当于重置了原有用户的密码。
测试方法:
(1) 获取已注册的用户名/手机号/邮箱;
(2) 使用(1)获取的用户名/手机号/邮箱注册,注册成功。
举例:
(1) 注册一个帐号,收到继续注册的邮件;
(2) 打开邮件中获取的继续注册的链接设置密码;
(3) 输入密码后,点击“完成”,并抓包拦截请求,修改请求中的用户名为其他用户的用户名,响应为true,即修改该用户的密码成功。
子弹观点
针对此类问题,修复建议很简单,即验证用户名/手机号/邮箱是否已存在。
No.6
图形验证码
图形验证码的测试可参见:【业务逻辑漏洞-1】-图形验证码实战总结。
增加一个:万能图形验证码,在验证码处输入000000或888888(验证码长度根据网站本身验证码长度自行调节)。
子弹观点
针对此类问题,建议从服务端验证图形验证码的值是否正确。
No.7
短信验证码
短信验证码的测试可参照:【业务逻辑漏洞-2】-短信验证码绕过实战总结。
增加一个:
万能验证码。注册时在验证码出输入000000或888888(验证码长度根据网站本身验证码长度自行调节)。
子弹观点
针对此类问题,修复建议是从服务端验证图形验证码的值是否正确。
No.8
输入输出
渗透思路:
测试密码找回功能的输入输出是否进行特殊字符的转义或过滤。
测试方法:
输入XSS脚本或SQL注入脚本,查看返回内容。
举例SQL注入:
(1) 在找回密码中输入已知用户名,密码输入,如
emailaddress@example.com,' or '1'='1
即可重置改用户密码并将新密码发送至指定邮箱中。(2) 同样在用户名一栏输入
' or number=1 or '1'='1
可以将指定用户ID的密码重置。
子弹观点
对输入输出进行过滤,可网上百度,不再详述。
No.9
密保问题
渗透思路:
(1) 问题和答案在源码中:密码找回进入密保问题页面时,直接查看页面源码。
(2) 未验证回答是否正确:在密保答案输入任意的答案,即通过校验。
测试方法:
(1) 问题和答案在源码中。进入密保问题回答页面,右击查看源码或按键F12,在页面查看问题和答案是否包含其中。
(2) 未验证回答是否正确。在密保答案输入任意的答案,点击确认或下一步,直接进入新密码设置页面。
以未验证回答是否正确为例
(1) 输入身份证号和验证码,点击“密保问题找回”;
(2) 输入任意的答案,点击“提交”,成功进入新密码设置页面。
子弹观点
涉及密保答案校验、验证的处理流程,需要在服务端进行。
【历史文章】
【业务逻辑漏洞-1】-图形验证码实战总结
【业务逻辑漏洞-2】-短信验证码绕过实战总结
【业务逻辑漏洞-3】-用户注册实战总结
更多精彩内容前往公众号历史消息查询
玩安全,让子弹先飞一会