为什么应该通过XSS注入来逃避Ampersand

时间:2016-08-29 20:21:31

标签: security escaping xss

OWASP建议逃避以防止XSS注射的五个字符是 &<>"'

其中,我无法理解为什么应该转义&(&符号)以及如何将其用作注入脚本的向量。有人可以举例说明所有其他四个被转义的字符但是&符号不是那么会有XSS注入漏洞。

我已经检查了另一个问题,但答案确实没有让事情变得更清楚。

1 个答案:

答案 0 :(得分:4)

答案here仅在HTML属性上下文中的嵌套JavaScript上下文中解决问题,而您的问题则专门询问纯HTML上下文转义。

在该问题中,转义应符合OWASP recommendation for JavaScript

  

除字母数字字符外,使用\ uXXXX unicode转义格式(X =整数)转义所有字符。

哪个已经处理&,因为它不是字母数字。

回答你的问题, 从实际的角度来看,为什么你不能逃避&符号?

&的HTML表示形式为&amp;,因此这样做很有意义。如果您没有,则只要用户在您的应用中输入&amp&lt&gt,您的应用就会呈现&<或{ {1}}代替>&amp&lt

边缘案例?当然。安全问题?它不应该是。

来自HTML5 syntax Character references section

  

字符引用必须以U + 0026 AMPERSAND字符(&amp;)开头。   在此之后,有三种可能的角色   引用:

     
      
  • 命名字符引用
  •   
  • 十进制数字字符引用
  •   
  • 十六进制数字字符引用
  •   

遇到&gt时:

  

切换到数据状态。

     

尝试使用字符引用,不允许额外使用   字符。

     

如果没有返回任何内容,则发出一个U + 0026 AMPERSAND字符(&amp;)标记。

     

否则,发出返回的字符标记。

因此,&之后的任何内容都会导致输出&或代表字符。由于以下字符必须是字母数字或者不会被消费,因此不存在转义字符(例如&'"> )被消费和忽略,因此攻击者改变解析上下文的安全风险很小。但是,您永远不知道是否存在不完全符合标准的浏览器错误,因此我总是会逃避<。 Internet Explorer存在一个问题,您可以在其中指定&,它将被解释为<%,允许绕过XSS攻击向量的.NET请求验证。总是更安全而不是抱歉。