本文讲述了印度票务平台Townscript缺乏速率限制,以及密码重置缺陷导致的任意账户劫持漏洞。速率限制(Rate Limiting)仍是大多数Web应用不太重视的问题,但一旦与其它功能形成漏洞利用,也将会导致严重的危害影响。

漏洞发现

Townscript是一家印度在线活动票务公司,主要提供研讨会、展览、马拉松和冒险活动等项目的登记、注册和售票服务,只要用户发布活动项目,注册和购票页面就会自动生成,其于2017年被印度另一家在线票务平台BookMyShow收购。

近期,我们打算在印度国内举办名为“Letshack”的安全训练营活动,作为活动发起方,我们把该项活动的售票放到了Townscript平台。不巧的是,注册进行了一段时间之后,我就把绑定Townscript平台的邮箱密码和登录Townscript平台进行注册人员管理的密码都忘记了,糟糕!已经注册了500多人,而且活动将在数周后开始,这该如何是好!思来想去,我注册了一个新的Townscript账户打算向Townscript官方发邮件看看有何解决办法。

但之后,我想就着测试一下Townscript应用吧,看看是否存在漏洞可利用以找回我的先前账户…。说整就整,起初我想到的就是SQL注入,虽然SQL注入漏洞影响较大,但发现过程稍显复杂,我就把测试重点放到了相对简单的登录和注册页面上。

接下来,我就测试了登录页面上的“忘记密码”功能,经过一番分析之后,我发现该“忘记密码”并没有部署速率限制措施(rate limit),那是不是可以据此对其它人的账户密码来个暴力枚举呢?

我以我当前新注册的Townscript账户为例,在忘记密码功能区域输入了与该账户绑定的邮箱地址,然后点击“找回密码”,然后,我在该账户绑定的邮箱中收到了以下找回密码的链接:

可见,上述找回密码链接非常简单,其中包括了绑定账户的邮箱地址和一个code,该code是一个6位数的数字。那就用我之前账户的邮箱地址来试试吧,随便输入一个code值,用Burp来暴力枚举试试:

把6位数的构造字典拉进去就是一番枚举,但大部份响应看似都是一些404页面未找到的302响应,在我快要放弃的时候,我又检查了一下响应长度,一看,其中存在长度为391的响应:

尝试着把该响应进行转发,哇,竟然可以成功跳转到以下密码重置界面!

就这样,在密码重置功能缺乏速率限制(Rate Limit)的情况下,我通过暴力枚举重置了我之前忘记了Townscript登录密码和绑定邮箱密码的Townscript账户,成功找回了丢失的Townscript账户权限,以及其中注册的数百个参与人员信息。

但是,Townscript应用在账户设置中严禁更改用户的绑定邮箱,所以,即使根据上述密码重置漏洞劫持了受害者账户,但受害者一样还可以通过自己的绑定邮箱再次发起密码重置请求,找回账户,那对攻击者来说,这就不算真正意义上的账户劫持。

接下来,我对Townscript应用中的用户设置(edit)操作请求进行了抓包,从中发现了包含的用户绑定邮箱地址,然后我尝试对其进行了替换:

之后,竟然可以成功实现邮箱修改:

这样一来,也就是说,我可以利用密码重置缺乏速率限制+Code暴力枚举+更改用户绑定邮箱,实现真正意义上的账户劫持,只要知道对方用户的Townscript绑定邮箱,就能对其实施账户劫持。

经验总结

针对登录页面或密码重置功能可以多花点心思进行研究,尤其是对其中的参数、编码或用户属性进行测试,另外,缺乏速率限制也是当前大多数Web应用存在的问题,可以考虑用它来与其它功能进行组合利用。

*参考来源:medium,clouds 编译整理,转自 FreeBuf