【问题标题】:Is this code vulnerable to XSS attacks?这段代码容易受到 XSS 攻击吗?
【发布时间】:2013-01-25 12:09:20
【问题描述】:

问题确实来自这个问题:
Why does the browser modify the ID of an HTML element that contains &#x?

给定以下网页:

<html>
  <head>
    <script type="text/javascript">
      // --------------------------------------------------------
      // could calling this method produce an XSS attack?
      // --------------------------------------------------------
      function decodeEntity(text){
        text = text.replace(/<(.*?)>/g,''); // strip out all HTML tags, to prevent possible XSS
        var div = document.createElement('div');
        div.innerHTML = text;
        return div.textContent?div.textContent:div.innerText;
      }
      function echoValue(){
        var e = document.getElementById(decodeEntity("/path/&#x24;whatever"));
        if(e) {
          alert(e.innerHTML);
        }
        else {
          alert("not found\n");
        }
      }
    </script>
  </head>
  <body>
    <p id="/path/&#x24;whatever">The Value</p>
    <button onclick="echoValue()">Tell me</button>
  </body>
</html>

&lt;p&gt; 元素的id 包含为防止 XSS 攻击而转义的字符。 HTML 部分和 JS 部分由服务器生成,服务器在这两个部分上插入相同的转义值(可能来自不安全的源)。

服务器以&amp;#x 格式转义以下字符范围:

  • 0x00 – 0x2D
  • 0x3A – 0x40
  • 0x5B – 0x5E
  • 0x60
  • 0x7B – 0xFF
  • 0x0100 – 0xFFFF

换句话说:没有转义的唯一字符是:

  • 0x2E – 0x39(./0123456789
  • 0x41 – 0x5A (AZ)
  • 0x5F (_)
  • 0x61 – 0x7A (az)

现在,我必须通过 javascript 访问 &lt;p&gt;。引用问题中的函数echoValue() 总是失败,因为浏览器在HTML 部分将&amp;#x24; 转换为$,但在JS 部分将其保留为&amp;#x24;

所以,Gareth 想出了简单有效的an answer

我担心的是,当使用引用答案中提供的decodeEntity() 函数时,通过转义动态字符串消除的 XSS 攻击的可能性会再次出现。

谁能指出是否存在安全问题(which?)或没有(为什么不?)?

【问题讨论】:

  • 只要让服务器不在脚本内转义即可。

标签: javascript html xss


【解决方案1】:

我首先建议您查看以下链接,讨论 JavaScript 中的 HTML 卫生和 Javascript 中的 XSS:

安全第一课: 不要重新发明轮子。如果之前已经做过某些事情,那么他们可能比您的临时解决方案做得更好。

尽管我无法从脑海中找到一种方法来利用您的简单正则表达式,但我并不相信它真的能捕捉到所有情况。第一个链接提供了一个更详细的解决方案,并且已经过彻底的审查和测试。

我也建议你看看XSS Filter Evasion Cheat Sheet。向您展示人们可能会想出什么样的讨厌的东西。

【讨论】:

  • 只是观察...两个链接都指向同一个 URL。也许那不是故意的。
【解决方案2】:

您对输入应用的额外约束可能会导致此攻击失败,但假设任意输入到decodeEntity,以下是运行脚本的示例:

decodeEntity("<img onerror='alert(\"test\")'\nsrc='test'>")

这是因为 /&lt;(.*?)&gt;/ 仅在 &lt;&gt; 在同一行时才匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-29
    • 2015-12-31
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多