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

本文详细分析了EasyXDM 2.4.19中的DOMXSS漏洞,涉及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
}

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

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

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

那么,让我们使用有漏洞的EasyXDM来确认这个XSS。

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

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>

您仍然看不到alert对话框。父窗口通过meta标签运行在IE5模式下。但iframe运行在IE8模式下。这是因为iframe页面有<!DOCTYPE html>。如果存在,IE11可以将文档模式降至IE8模式。为了XSS,我们必须以某种方式降至IE7模式。

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

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

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

似乎message/rfc822文档默认在IE5模式下渲染。而且它的文档模式继承能力比text/html页面更强。即使页面有<!DOCTYPE html>,我们也可以将文档模式降至IE7模式。因此,我们可以到达有漏洞的代码。w00t! :)

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

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

发布信息

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

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