从429到200:利用X-Overwriting头实现速率限制绕过与漏洞赏金
从429到200:利用X-Overwriting头实现速率限制绕过与漏洞赏金
Akwaaba!各位。在本报告中,我将展示如何绕过某组织匆忙实施的速率限制机制。如果你对我的其他技术文章感兴趣,可以查看我之前关于如何绕过Google验证码实现CSRF和XSS链式攻击的文章,或者关于Android Intent重定向攻击的文章。
速率限制技术
速率限制是应用程序开发者用来控制用户或系统在特定时间范围内请求数量的技术。在API中,速率限制的标准响应状态码是429(请求过多),但许多开发者会选择偏离这一标准。常见的速率限制实现方式包括:
- 基于IP地址的速率限制
- 基于电子邮件的速率限制
- 基于设备或会话的速率限制
- 基于地理位置的速率限制
- 特定端点的速率限制等
我们都遇到过这种情况,特别是当我们忘记账户密码时。大多数应用程序会要求你"冷静"一段时间后再尝试。例如微软会在多次无效登录后给你一个冷却期。但并非所有应用都如此,比如Snapchat会在特定时间内多次无效登录后暂时禁用你的账户。
漏洞发现
某次在HackerOne上测试一个项目时,我发现他们应用程序中某个功能缺乏速率限制。他们的修复团队反应迅速,很快实施了修复措施。我决定检查这个新实现:
在5次无效登录尝试后,系统会返回标准的429状态码。在响应负载中,除了消息外,还新增了一个显示你公网IP地址的ip参数。这让我怀疑他们是基于IP地址来统计登录尝试次数。
利用X-Overwriting头绕过
要绕过基于IP的速率限制,黑客可以尝试多种方法。最明显的选择是使用VPN,当一个IP地址被限制时,只需切换到另一个。但当你有一个庞大的密码列表需要暴力破解时,这种方法就不太可行了。
接下来我尝试使用X-Overwriting头。X-Overwriting头是一类非标准HTTP头,可用于覆盖或操纵Web服务器或应用程序的行为。常见的例子包括:
- X-HTTP-Method-Override:允许覆盖HTTP方法
- X-Original-URL/X-Rewrite-URL:用于URL重写
- X-Forwarded-For:指示通过代理连接的客户端的原始IP地址
- X-Real-IP:传递客户端IP地址的另一种方式
实际绕过过程
我开始测试一些客户端IP地址覆盖头。首先尝试的是X-Forwarded-For头,我传入了本地IP127.0.0.1。这样做的目的是告诉应用服务器,127.0.0.1是我的原始IP地址。结果我没有收到429状态码,而是收到了401,并且在负载中可以看到伪造的localhost IP与我的公网IP同时出现。
由于每个IP地址在5次登录尝试后就会被限制,为了成功自动化进行暴力破解攻击,我将此配置到Burp Suite的Intruder中:
- 使用Sniper攻击模式,在IP地址的一个八位字节上添加有效载荷位置
- 使用Numbers有效载荷类型
- 设置1到500次暴力请求(可以更多)
运行后,每个请求都通过X-Forwarded-For头发送不同的原始IP地址。查看X-RateLimit-Limit计数器,可以看到每个IP只运行一次,还有4次请求剩余。但由于该应用甚至允许八位字节超过255的无效IP地址,我们可以进行无限的暴力破解。
缓解措施
对于基于IP的速率限制:
- 如果请求将通过代理到达你的应用,配置应用或Web服务器只信任来自已知内部代理(如NGINX、Cloudflare)的X-Forwarded-For头
- 使用网络层(如REMOTE_ADDR)的IP地址,而不是信任头信息
- 在请求到达应用前,使用反向代理或WAF(如Cloudflare、AWS WAF、NGINX)强制执行速率限制
感谢阅读本文,如有任何问题,可以通过Twitter @tinopreter联系我。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码