URL 上的 HTML <script> 片段可以用于纯客户端应用程序中的 XSS 吗?
Can an HTML <script> fragment on the URL be used for XSS in a purely client side application?
背景
假设我有以下网页:
<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
因为尖括号 <>
是 not valid URL characters 它们似乎在进入 JS 运行时之前就被浏览器自动编码了。
我的假设
这让我相信,使用 document.write
直接在客户端 直接呈现查询字符串总是安全的 ,而不是可能的 XSS 向量。 (我知道应用程序当然还有很多其他方式容易受到攻击,但让我们坚持这里描述的精确案例。)
我的问题
我这个假设正确吗?
- URL 中不安全字符的入站编码是否在所有合理的浏览器中标准化/强制执行? (没有可能的 XSS)
- 或者,这只是我不应该在全球范围内依赖的某些(现代?)客户端的细节/实现细节吗? (上述XSS理论上是可以的)
与问题无关,但很有趣。如果我先解码 URI,那么浏览器行为就会不同:document.write(decodeURI(location.search.substr(1)));
。 Chrome 和 Safari 中的 XSS Auditor 会阻止该页面,而 Firefox 会显示警报。
如果我在 Windows XP 上的 IE6 上使用查询字符串 ?<script>alert("d")</script>
我得到注入的代码显示警报,这也会发生在使用 decodeURI
或 decodeURIComponent
页面,所以如果 IE6 仍然是一个合理的浏览器,我会说你的第二个假设是正确的:它是现代浏览器的一个功能
我还看到 Firefox 53 在使用解码方法时显示注入的 XSS 警报,Opera 44 和 Chrome 57(全部在 windows 上)阻止代码。
根据 RFC 3986, section 2.4 不安全字符的入站编码 是 标准化的。尽管出于两个原因我建议不要依赖它:
- 并非所有浏览器都实现它
- 有太多的浏览器可能会无意或有意地以另一种方式进行浏览。
背景
假设我有以下网页:
<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
因为尖括号 <>
是 not valid URL characters 它们似乎在进入 JS 运行时之前就被浏览器自动编码了。
我的假设
这让我相信,使用 document.write
直接在客户端 直接呈现查询字符串总是安全的 ,而不是可能的 XSS 向量。 (我知道应用程序当然还有很多其他方式容易受到攻击,但让我们坚持这里描述的精确案例。)
我的问题
我这个假设正确吗?
- URL 中不安全字符的入站编码是否在所有合理的浏览器中标准化/强制执行? (没有可能的 XSS)
- 或者,这只是我不应该在全球范围内依赖的某些(现代?)客户端的细节/实现细节吗? (上述XSS理论上是可以的)
与问题无关,但很有趣。如果我先解码 URI,那么浏览器行为就会不同:document.write(decodeURI(location.search.substr(1)));
。 Chrome 和 Safari 中的 XSS Auditor 会阻止该页面,而 Firefox 会显示警报。
如果我在 Windows XP 上的 IE6 上使用查询字符串 ?<script>alert("d")</script>
我得到注入的代码显示警报,这也会发生在使用 decodeURI
或 decodeURIComponent
页面,所以如果 IE6 仍然是一个合理的浏览器,我会说你的第二个假设是正确的:它是现代浏览器的一个功能
我还看到 Firefox 53 在使用解码方法时显示注入的 XSS 警报,Opera 44 和 Chrome 57(全部在 windows 上)阻止代码。
根据 RFC 3986, section 2.4 不安全字符的入站编码 是 标准化的。尽管出于两个原因我建议不要依赖它:
- 并非所有浏览器都实现它
- 有太多的浏览器可能会无意或有意地以另一种方式进行浏览。