URL上的HTML <script>片段是否可以用于纯客户端应用程序中的XSS?

时间:2017-04-16 10:15:14

标签: javascript html http security xss

背景

&#xA;&#xA;

说我有以下网页:

&#xA;&#xA;
 &lt; html&gt;&# XA; &LT;脚本&GT;&#XA; document.write('querystring ='+ location.search.substr(1));&#xA; &lt; / script&gt;&#xA;&lt; html&gt;&#xA;  
&#xA;&#xA;

我在这样的网址上打开它:

& #xA;&#xA;
  http://完全安全网站/?&lt; script&gt; alert('fsecurity')&lt; / script&gt;& #xA;  
&#xA;&#xA;

在所有尝试的浏览器(Chrome 57,Firefox 52和Safari 10)中,结果是:

&#xA;&# XA;
&#XA;

querystring =%3Cscript%3Ealert(%27fsecurity%27)%3C / script%3E

&#xA;
&#xA;&#xA;

因为尖括号 &lt;&gt; 无效的网址字符它们似乎会在进入JS运行时附近的任何地方被浏览器自动编码。

&#xA;&#xA;

我的假设

&#xA; &#xA;

这让我相信,使用 document.write 直接在客户端上呈现查询字符串始终是安全的,而不是可能的XSS向量。 (我意识到当然还有许多其他方式可以让应用程序容易受到攻击,但让我们坚持这里描述的精确案例。)

&#xA;&#xA;

我的问题

&#xA;&#xA;

我在这个假设中是否正确?

&#xA;&#xA;
    &#xA;
  • 在所有合理浏览器中标准化/强制规定的URL中的不安全字符的入站编码是什么? (没有可能的XSS)
  • &#xA;
  • 或者,这只是某些(现代?)客户的精确/实施细节,我不应该全球依赖它们? (上面描述的XSS在理论上是可行的)
  • &#xA;
&#xA;&#xA;
&#xA;&#xA;

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

&#xA;

2 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:1)

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

  • 并非所有浏览器都实现它
  • 在野外有很多浏览器,可能会以不同的方式或意图以另一种方式进行。