通过多重绕过实现经典账户接管案例
引言
最近在Synack的一个程序中发现了密码重置/恢复漏洞。该漏洞是通过主机头注入进行经典密码重置链接操纵,但与其本身相比,我成功利用它的方式可能更有趣。简而言之,这份报告包含CDN绕过+正则表达式绕过+主机头注入,最终导致账户接管漏洞。
CDN绕过
在测试目标时,发现Web应用程序位于Akamai CDN后面,这对于现代Web应用程序来说相当合理。CDN不仅提供分布式服务器以加速Web内容交付,还带来了一些安全功能。其中一个安全功能是防止主机头注入漏洞,但如果你不能将其与其他攻击向量链式利用,这个功能就不那么显著。
CDN相当坚固,不容易绕过其安全功能,但找到Web应用程序的原始IP并直接访问可能更容易。当公司有数千个资产时,不限制对位于CDN/WAF/LB等组件后面的公共应用程序的直接访问是一个常见的错误配置。作为一种方法,我通过amass收集了目标公司的子域,并向特定的login.html页面发送带有Host: target.com的HTTP请求,以检查是否有任何子域响应相同的页面。
我得到了3个匹配,响应代码为200 OK。其中两个是误报,但另一个在发送带有适当Host头的HTTP请求时响应相同的登录页面。因此,我们绕过了CDN,找到了Web应用程序的原始IP。
正则表达式绕过
另一方面,在测试过程中,我发现Web应用程序由IBM HTTP Server提供。我搜索了一下,找到了IBM的一份文档《防止主机头注入》。
作为给定示例主机正则表达式列表的结果,它无法防止主机头注入,并且仍然匹配像www.target.com.test这样的主机头。因此,如果你遵循给定的文档,你仍然容易受到攻击。
不当的验证是由于正则表达式验证末尾缺少$符号,该符号应仅在文本或字符串以给定值结束时返回匹配。
账户接管
这实际上是无聊的部分。这是一个经典的密码恢复缺陷,依赖于用户控制的Host输入,并据此生成密码重置链接。有关详细信息,请参阅PortSwigger。
关键要点
- 限制对位于CDN/WAF/LB等组件后面的资产的直接访问是必须的,特别是如果你依赖它们的安全功能。使用IP白名单方法,仅允许从组件IP访问。
- 永远不要信任用户控制的数据,如果需要,请正确验证和清理。
- 不要低估安全问题。即使存在像主机头注入这样的小问题,它也可以与其他攻击向量和错误配置链式利用。