去年,我们一直在玩一种用简单的方法就可以在Edge上进行referer欺骗,它可以让我们实现referer
欺骗和绕过XSS
筛选器。今天我发现这个漏洞已经被修补了,所以我决定试试寻找绕过补丁的方法。我觉得这其实不是一种绕过而是一个攻击的变化。从实际的角度来看,它绕过了补丁,但从技术的角度来看,该方法有所不同。无论哪种方式,让我们一起看看吧!
在之前的文章中,我们看到通过打开一个带着对应referrer
的新窗口,然后跳转到目标位置即可实现referrer
欺骗。
可以看下面的两行POC
代码。在下面的POC
代码中whatismyreferrer.com
认为referrer
是paypal.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
页面还是iframe
的URL
呢?
在回答问题之前,请记住,通常referrer
网址应该发起请求。假设我们的facebook.com
有一个iframe
指向evil.com
,并且iframe
将顶部的URL
更改为paypal.com
,那么paypal
接收到的referrer
应该是evil
,而不是Facebook
。
上图显示了即使Edge
上的结果是正确的行为,但是,如果不使用常规链接,而是使用location.href
设置顶部location
的话,那么Edge
会困惑,并使用顶部的地址作为referrer
。
以下是一个简单的测试页面,其中显示了常规链接和location.hre
之间的区别,以更改顶部的URL
。两者都会带你到whatismyreferer.com
,但你会看到常规链接的跳转是正常的,而top.location.hre
f没有。
但是我们如何利用这个漏洞呢?很显然,Facebook
永远不会提供恶意的iframe
对吧?好吧,像Facebook
和雅虎这样的大厂商一般都会提供iframe
广告服务。这些广告会代表这些大型网站加载任何网页。此外,使用top.location.href
的话,这些广告可以绕过XSS
过滤器。
就个人而言,我讨厌理论上的漏洞,因为这样无法满足我。例如”如果用户点击这里,接受警告,解压zip
和双击点击,他被感染 ”。
我们加载一个有效的漏洞的目标是通过将iframe
注入到欺骗referrer
站点中,然后从中执行top.location
。这与任何网站上放置iframe
一样,也就是说,我们要让whatismyreferer.com
(受害者)相信用户来自paypal.com
(欺骗referrer
)。我们该怎么做呢?
Paypal
。iframe
。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'");
*作者:brokenbrowser,