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 向量。 (我知道应用程序当然还有很多其他方式容易受到攻击,但让我们坚持这里描述的精确案例。)

我的问题

我这个假设正确吗?


与问题无关,但很有趣。如果我先解码 URI,那么浏览器行为就会不同:document.write(decodeURI(location.search.substr(1)));。 Chrome 和 Safari 中的 XSS Auditor 会阻止该页面,而 Firefox 会显示警报。

如果我在 Windows XP 上的 IE6 上使用查询字符串 ?<script>alert("d")</script> 我得到注入的代码显示警报,这也会发生在使用 decodeURIdecodeURIComponent页面,所以如果 IE6 仍然是一个合理的浏览器,我会说你的第二个假设是正确的:它是现代浏览器的一个功能

我还看到 Firefox 53 在使用解码方法时显示注入的 XSS 警报,Opera 44 和 Chrome 57(全部在 windows 上)阻止代码。

根据 RFC 3986, section 2.4 不安全字符的入站编码 标准化的。尽管出于两个原因我建议不要依赖它:

  • 并非所有浏览器都实现它
  • 有太多的浏览器可能会无意或有意地以另一种方式进行浏览。