补天大佬carry_your之前讲解了一个视频,关于任意密码重置的十种姿势。顿时醍醐灌顶,深有感触。放上视频链接https://www.ichunqiu.com/course/59045
0x01 验证码不失效(存在暴力破解可能性)
0x02 验证码直接显示在response中
0x03 验证码未绑定用户
在发送手机号和验证码时,仅对验证码是否正确进行了判断。未对该验证码是否与手机号匹配进行验证。(即在提交手机号和验证码时可更换成他人手机号通过验证。)
0x04 修改接收的手机或邮箱
未对用户名,手机号和验证码三者做统一的验证,仅判断了手机号和验证码是否匹配和正确。
0x05 本地验证的绕过(修改返回包)
随意输入验证码,从返回包中将标志值false
改为true
,从而使客户端误以为验证成功,绕过验证步骤进入密码重置界面。
解决方法:在重置密码处在服务端进行二次验证;在验证中加入token;在session中加入状态值。
0x06 跳过验证步骤
对于验证步骤没有做校验,导致可以直接输入最终重置密码的网址达到重置密码的目的。
0x07 未检验用户字段值
在设置新密码步骤时,缺少对操作用户的身份判断,导致可通过修改数据包内的用户身份来修改他人的密码。
0x08 修改密码处id可替换
类似与上一种。在修改用户密码时,通过id字段来修改用户密码,执行了类似update user set password='qwe123456' where id='1'
的sql语句。
0x09 cookie值可替换
在重置密码的最后一步仅判断了唯一用户标志cookie是否存在,未判断该cookie是否有通过之前的验证流程。导致可以通过替换cookie来修改他人密码。(目标用户cookie可通过第一阶段来获取)
0x0A 修改信息时替换隐藏参数(精)
在执行修改个人信息的sql语句的时候,用户的密码也当作字段执行了,且根据隐藏参数loginId
来执行。只要在修改信息的POST数据包中添加或替换成他人的loginId
和对应的值,即可修改他人密码。(参数名一般可在页面中找到)