说我有以下网页:
<html>
<script>
document.write('querystring=' + location.search.substr(1));
</script>
<html>
我在这样的URL上打开它:
http://completely-secure-site/?<script>alert('fsecurity')</script>
在所有尝试使用的浏览器(Chrome 57,Firefox 52和Safari 10)中,结果为:
querystring =%3Cscript%3Ealert(%27fsecurity%27)%3C / script%3E
因为尖括号<>
是无效的URL字符,他们似乎得到自动被浏览器的方式编码,才可以拿到附近的JS运行时的任何地方。
这使我相信,使用document.write
来直接在客户端上直接呈现查询字符串始终是安全的,而不是可能的XSS向量。(我意识到,当然还有很多其他方法可以使应用程序容易受到攻击,但让我们坚持此处所述的确切情况。)
我对这个假设是否正确?
与这个问题无关,但很有趣。如果我先解码URI,那么浏览器的行为就不同了:document.write(decodeURI(location.search.substr(1)));
。Chrome和Safari中的XSS Auditor都会阻止页面,而Firefox会显示警报。
如果我?<script>alert("d")</script>
在Windows XP的IE6上使用查询字符串,则使注入的代码显示警报,这种情况也会在decodeURI
或decodeURIComponent
页面中发生,因此如果IE6仍然是一个合理的浏览器,我会说您的第二个假设是正确的:这是现代浏览器
我还看到Firefox 53在使用解码方法时显示注入的XSS警报,Opera 44和Chrome 57(均在Windows上)阻止了代码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句