Open Graph的劫持
在另一个站点上,非缓存键的输入专门影响Open Graph URL:
Open Graph是一种由Facebook创建的协议,允许网站所有者控制他们在社交媒体上分享的内容。我们劫持的og:url参数有效地覆盖了分享的URL,因此任何分享被投毒的页面的人实际上最终都会分享我们指定的内容。
您可能已经注意到,应用程序设置了"Cache-Control:private",而Cloudflare拒绝缓存此类响应。幸运的是,网站上的其他页面明确启用了缓存:
这里的"CF-Cache-Status"协议头是Cloudflare正在考虑缓存此响应的指示,但尽管如此,响应从未实际缓存过。我推测Cloudflare拒绝缓存这个可能与session_id cookie有关,并且使用该cookie重试:
最终我得到了缓存的响应,后来发现我可以跳过猜测并阅读Cloudflare的缓存文档。
尽管缓存响应,但“分享”结果仍然没有投毒; Facebook显然没有达到我投毒特定Cloudflare缓存的要求。为了确定我需要投毒哪个缓存,我利用了所有Cloudflare站点上的一个有用的调试功能 —— /cdn-cgi/trace:
在这里,colo=AMS行显示Facebook已经通过Amsterdam的缓存访问了waf.party。目标网站是通过 Atlanta访问的,所以我在那里租了2美元/月的VPS并再次尝试投毒:
在此之后,任何试图在其网站上共享各种页面的人最终都会分享我选择的内容。这是一个经过修改的攻击视频。
本地路由投毒
到目前为止,我们已经看到基于cookie的语言劫持,并且使用各种协议头的攻击去覆盖主机。在这一点的研究上,我还发现了一些使用奇怪的非标准协议头的变体,例如"translate","bucket"和"path_info",并且我怀疑遗漏了许多其他协议头。在我通过下载并搜索GitHub上的前20,000个PHP项目以获取协议头名称来扩展协议头wordlist之后,我的下一个重大进展来了。
这揭示了协议头X-Original-URL和X-Rewrite-URL,它覆盖了请求的路径。我首先注意到的是它们会影响目标运行Drupal,并且通过挖掘Drupal的代码发现,对此协议头的支持来自流行的PHP框架Symfony,它又是从Zend获取的代码。最终结果是大量的PHP应用程序无意中支持这些头文件。在我们尝试使用这些协议头进行缓存投毒之前,我应该指出它们也非常适合绕过WAF和安全规则:
如果应用程序使用缓存,为把协议头混淆到错误的页面,就有可能滥用这些协议头。例如,此请求的缓存键为/education?x=y,但从/gambling?x=y检索内容:
最终结果是,在发送此请求后,任何试图访问Unity for Education页面的人都会感到惊讶:
改变页面的能力看上去更有趣些,但它也许能带来更大的利益。