首先这不是一篇总结性的帖子,毕竟对于密码找回的测试方法网络上有比较全面的总结,比如用户凭证暴力破解,系统返回了重要的凭证,邮箱手机弱token,token通用,session覆盖,用户凭证有效期问题,凭证算法被破解,前端校验等等一系列漏洞。在这里附上前辈总结的脑图,总结的也是比较详细了。
在日常的授权测试以及论坛瞎逛中,发现了一些对于个人而言比较有意思的找回密码的操作,独乐乐不如众乐乐,分享出来希望能帮到各位师傅。
有些人认为HTTP的联机就是靠包里的HOST header来连接的,所以会认为如果修改掉包里的HOST, 那么就连接不到目标服务器,所以是不可控的。其实HTTP的联机与包里的HOST并没有啥关系, HTTP的联机是TCP/IP建立的, 所以修改掉HOST HEADER并不会把包丢到另外一个服务器上。
所以当应用使用$_SERVER['HTTP_HOST']获取网站URL并拼接到找回密码的链接当中就会产生漏洞。当你使用网站密码重置功能时,网站URL可能在将来会改变,所以要动态地生成一个邮箱找回密码的链接来匹配服务器的URL。这个时候可能就会使用$_SERVER['HTTP_HOST'],Host header 是客户端提供的,意味着攻击者可以将他们自己的网址写到重置密码的邮件当中,威胁任意用户的账户安全。通过 X-Forwarded-Host 来拼接找回密码链接中的域名,这样可以通过写入自己控制的域名,然后通过访问记录发现找回密码链接,在拼接回正确域名重置任意用户密码。
利用条件是受害者必须要点击重置链接,你才能从你控制的网站中通过访问记录查看到重置链接。
举个kackerone的例子:
Mavenlink允许用户注册一个mavenlink.com的子域名去展示他们的内容,所以他们需要一个方法去动态地决定公司的子域名。
host header 可以设置为mavenlink.com的任意子域名,但是从mavenlink.com更改域名将会返回一个错误,而不是发送一个邮件。
添加一个随机的mavenlink.com的子域名,但是这会被定向到正确的页面,没办法插入自己的域名。
测试特殊字符。服务器接受host header中的一个问号,生成下面的链接
Host: example.com?.mavenlink.com
这样就可以从用户邮件中盗取密码重置token
当然这里还涉及到了域名检测的绕过问题,一旦用户点击该链接,我们在example.com即可获取到重置链接信息
在给后端传递要发送验证链接的邮箱或者手机号时,可以传递一个邮箱或者手机的集合,然后只要第一个邮箱或者手机号是数据库里存在的邮箱或者手机号,那么 将会向这批手机号或者邮箱发送一样的链接信息
团队测试中遇到的例子:
在hackerone披露的漏洞中同样存在这样的例子,通过发送两个邮箱,一个为受害者的邮箱,一个为自己控制的邮箱,这样就可以窃取到受害者邮箱中的重置密码的链接,达到任意用户密码重置的目的。
由于没有看到过这种触发该漏洞的源码,猜测验证环节是允许获取一个类似于集合的东西,遍历其中的值是否有存在于数据库中的值,如果存在则对该集合放行,然后发送验证信息的逻辑同样允许传入一个集合再去遍历集合中的每一个值,
对每一个值发送一样的验证链接
由于sql语句的拼接问题导致在手机号处存在sql注入问题,其实这也告诉我们在sql语句的执行中只要涉及到了拼接问题就有可能存在漏洞,在团队授权的测试中也遇到过更改日期处存在sql注入的例子,反正都挺好玩的。
这里用了一个sqrt函数,sqrt为一个平方根计算函数,当经过平方根计算之后和前面的数字拼接,手机号存在于数据库中则发送验证码
如果经过计算和前面的数字拼接手机号不存在于数据库中则显示验证码发送失败
通过这种方式来进行数据库相关信息的猜测
这种逻辑漏洞总是在攻与防的斗争中不断前进,肯定会有脑洞大开的人发现更多的骚套路,这是目前在测试中遇到过的几种比较有意思的任意用户密码重置漏洞的操作,在互联网上能找到例子的尽量采用了互联网例子,如有侵权地方还望告知