XSS:为什么在分配这个javascript字符串时会触发警报?

时间:2018-06-13 16:39:46

标签: javascript xss

我正在调查一个XSS问题,该问题可以在以下简单的html文件中复制,加载后会显示一个值为" 1"的警报。

为什么这样做? title字符串中包含警报脚本标记,但我很惊讶浏览器会将其呈现,因为</script>标记位于字符串中?

的test.html

<html>
    <head>
      <script>
        var title = "</script><svg/onload=alert(1)>";
      </script>
    </head>
  <body></body>
</html>

编辑:注意,我已将示例简化为简单的字符串赋值。

1 个答案:

答案 0 :(得分:1)

由于</script>字符串中的title结束了您的脚本,因此以下svg是HTML的一部分。

为了防止这种情况:

  1. 请勿使用内联脚本或

  2. 如果您这样做,您在其中呈现的任何用户来源输入都不需要</script>。 (我可能是偏执狂,并允许</以及script>之间的空格;在JavaScript正则表达式中,<\s*/\s*script\s*>与{ {1}}标志。)

  3. 对于#2,编码实体可以工作,或者只是在内容中的斜杠前面插入反斜杠。如果您这样做(服务器端),那么您将拥有:

    m

    ......不会发出警报。 (我只添加了一个反斜杠,但当然,这是一个字符串文字,所以它会被转义。)

    ,如果您在网页中添加了不受信任的内容,则可以通过owasp.org XSS (Cross Site Scripting) Prevention Cheat Sheet阅读来获得良好的服务。以上对于这个特定用途可能就足够了,但您可能希望更进一步,您当然希望对HTML中包含的任何内容(而不是脚本)元素进行HTML转义。 (这是HTML文本,即使它们是<html> <head> <script> var test = { "id" : 12181, "title" : "<\\/script><svg/onload=alert(1)>", "email" : null }; </script> </head> <body> </body> </html> 等),等等。