0x01 概述

去年,我们一直在玩一种用简单的方法就可以在Edge上进行referer欺骗,它可以让我们实现referer欺骗和绕过XSS筛选器。今天我发现这个漏洞已经被修补了,所以我决定试试寻找绕过补丁的方法。我觉得这其实不是一种绕过而是一个攻击的变化。从实际的角度来看,它绕过了补丁,但从技术的角度来看,该方法有所不同。无论哪种方式,让我们一起看看吧!

0x02 没修复时的POC

在之前的文章中,我们看到通过打开一个带着对应referrer的新窗口,然后跳转到目标位置即可实现referrer欺骗。

可以看下面的两行POC代码。在下面的POC代码中whatismyreferrer.com认为referrerpaypal.com(已经修复),实际上它应该是执行location.href的页面的URL

win = window.open("https://www.paypal.com");
win.location.href = "https://www.whatismyreferer.com";

这足以欺骗Edge上的referrer,但是它已经被修复了,但是我想到了一个简单的变种攻击方法,不用调试或分析,明显只是一个大胆测试。

我尝试了几种方法来更改最终URL(不使用location.href,使用location.replace,meta refresh,window.open等法法)来测试Edge是否可以最次被欺骗,但最后都失败了,但如果从iframe内部更改URL会发生什么情况呢?referrer值会变成top页面还是iframeURL呢?

玩转referrer

在回答问题之前,请记住,通常referrer网址应该发起请求。假设我们的facebook.com有一个iframe指向evil.com,并且iframe将顶部的URL更改为paypal.com,那么paypal接收到的referrer应该是evil,而不是Facebook

01-correct-behavior

上图显示了即使Edge上的结果是正确的行为,但是,如果不使用常规链接,而是使用location.href设置顶部location的话,那么Edge会困惑,并使用顶部的地址作为referrer

02-incorrect-behavior

以下是一个简单的测试页面,其中显示了常规链接和location.hre之间的区别,以更改顶部的URL。两者都会带你到whatismyreferer.com,但你会看到常规链接的跳转是正常的,而top.location.href没有。

显示漏洞的测试页  ]

但是我们如何利用这个漏洞呢?很显然,Facebook永远不会提供恶意的iframe对吧?好吧,像Facebook和雅虎这样的大厂商一般都会提供iframe广告服务。这些广告会代表这些大型网站加载任何网页。此外,使用top.location.href 的话,这些广告可以绕过XSS过滤器。

就个人而言,我讨厌理论上的漏洞,因为这样无法满足我。例如”如果用户点击这里,接受警告,解压zip和双击点击,他被感染 ”。

我们加载一个有效的漏洞的目标是通过将iframe注入到欺骗referrer站点中,然后从中执行top.location。这与任何网站上放置iframe一样,也就是说,我们要让whatismyreferer.com(受害者)相信用户来自paypal.com(欺骗referrer)。我们该怎么做呢?

注入iframe

  1. 打开一个新窗口,将服务器重定向到Paypal
  2. 在重定向发生之前,先注入iframe
  3. 一旦重定向,从iframe内部中用top.location跳转到whatismyreferer.com

其实这个iframe注入,在以前IE文章的htmlFile/UXSS文章中的底部描述过,这里让我们在这里快速回顾一下。

当我们用服务器重定向(1)打开新窗口时,在重定向发生之前,我们可以访问它的DOM,这就是我们注入iframe(2)的时候。一旦重定向发生,Edge将尽力从页面删除所有页面(包括我们的iframe)并渲染PayPal,但是我们将通过阻塞线程来阻止它。然后,一旦重定向发生,我们可以解锁该线程,并从iframe内部执行一个top.location.href(3)。

在这种特殊情况下,我们可以使用与这里这里相同的技术阻止线程,然后可以看到一个ugly-visible-bold alert。当然有办法阻止它不警报和不与用户交互,如果Poc会弹出警报,而且用户必须进行交互,它将变得没有什么用处。

完整的POC

// Open a new window with a server redirect to paypal
var win = window.open("redir.php?URL=https://www.paypal.com");
 
// Create an iframe immediately, before it redirects
var ifr = win.document.createElement("iframe");
win.document.appendChild(ifr);
 
// Make sure the iframe has access to its top (otherwise it will lose it)
win[0].opener = win;
 
// Block the iframe and once the redirect happens, move to the victim website.
win[0].setTimeout("alert('Close me once the site starts loading behind');" +
 "opener.location='https://www.whatismyreferer.com'");

03-spoofed-referrer

Edge上的测试Poc

 

*作者:brokenbrowser

源链接

Hacking more

...