简述密码找回漏洞
密码找回漏洞
0x00.用户凭证暴力破解
即发来的验证码可以通过爆破的方式进行破解(四位或六位纯数字)
0x01.返回凭证
在忘记密码的某些地方发送数据,抓包找线索
url 返回验证码及 token
- 通过抓包等方式找到可疑的地方
密码找回凭证
网上申诉的密保问题可能会在数据包或者是页面源代码里边
并且可以通过只输入账号,或者手机号等单一信息来看服务器返回什么
0x02.邮箱弱 token
因为重置密码的操作通常都是一个发到邮箱里的链接,那个链接的参数肯定有指定是哪一个用户以及一些 token
所以:
可以尝试分析 token 的规律,来构造重置链接,(故不需要登上目标的邮箱)
邮箱里找回密码的 url 可能含有 auth,而生成 auth 用的是 rand()函数,windows 下 rand()最大值是 32768,如果我们队 32768 的每个数字取 md5,然后将 32768 个 md5 放置进 auth 去爆破,我们或许可以重置其他人的密码
0x03.越权推荐绑定
- 创建一个账号后,推荐绑定的地方,可以通过修改链接中的参数值来越权绑定其他账号
例如:创建一个账号,完成后弹出绑定手机号页面,填写自己的手机号,并修改链接中用户名的参数为目标的用户名,就可以将目标账号绑定到自己的手机上
然后走正常通过手机找回密码的操作即可
- 创建一个自己的账号,点击找回密码,在自己的邮箱中看链接的形式,如果形式是用户名加弱 token 即上面的操作,但是如果是有其他绑定方式,如下:
1 | http://www.cpbao.com/user/fund!bindMobileOrEmail.action?userIdCard=用户ID&isBindEmail=1&bindEmail=邮箱 |
就可以使用把用户名改为他人的,而邮箱仍留位自己的。
0x04.服务器验证
最终提交步骤
进行一个账号正常的重置密码操作,因为有可能发到邮箱里的链接不好分析,然后点进重置密码链接,在最后提交更改密码时抓包,将 uid 更改目标用户,即可重置目标用户的密码
可以抓取最后步骤的包,更改验证步骤的参数,例如:step = 4 来跳过验证步骤
0x05.本地验证
- 只要发出去的 request 和回来的 response 里验证码的数据是一样的,则验证成功。所以验证验证码的时候,先随便填写一个验证码,记住发出去的 request 里的验证码的具体参数,例如:
1 | https://account.oppo.com/index.php?q=user/confirmid&type=1&sign=e9fb209c9416fb0312980c47c4537f0b //即sign这里的参数 |
然后去拦截 response 包,包里从服务器返回的数据如下:
1 | HTTP/1.1 200 OK |
只需要将内容修改为:
1 | {"flag":1,"msg":"?q=user\/resetPass&username=&type=1&sign=e9fb209c9416fb0312980c47c4537f0b"} |
即可绕过本地验证
- 有可能一次验证或是别的操作会有多次的发包行为,如果有下一次是基于上一次返回的数据的,则可以更改第一次的 response 包来达到改变第二次 request 包的效果
0x06.[[sql注入]]
- 有可能在找回密码时,输入的用户名会与数据库进行交互,导致[[sql注入]]漏洞
0x07.注册覆盖
- 有种奇葩的注册覆盖模式,原理是输入用户名后系统会在输入框后立刻判断用户名是不是已经存在了,其原理是提交了一个有输入用户名的表单(包括下面的密码等)。所以可以利用最后填写用户名,先填写下面的密码等,最后填写用户名时写 admin,这时递交上去的表单就是包含新密码等一切数据的 admin 用户,后果就是会自动覆盖过去的 admin 用户的信息并已经登录成功了
0x08.session 覆盖
- 用不同账号在同一个浏览器进行两次账号发送给邮箱的重置密码链接的操作,然后在同一个浏览器里打开第二个链接,服务器会以为第二个链接的用户是第一个的,所以会间接重置第一个用户的密码