我正在调查一个XSS问题,该问题可以在以下简单的html文件中复制,加载后会显示一个值为" 1"的警报。
为什么这样做? title
字符串中包含警报脚本标记,但我很惊讶浏览器会将其呈现,因为</script>
标记位于字符串中?
<html>
<head>
<script>
var title = "</script><svg/onload=alert(1)>";
</script>
</head>
<body></body>
</html>
编辑:注意,我已将示例简化为简单的字符串赋值。
答案 0 :(得分:1)
由于</script>
字符串中的title
结束了您的脚本,因此以下svg
是HTML的一部分。
为了防止这种情况:
请勿使用内联脚本或
如果您这样做,您在其中呈现的任何用户来源输入都不需要</script>
。 (我可能是偏执狂,并允许<
和/
以及script
和>
之间的空格;在JavaScript正则表达式中,<\s*/\s*script\s*>
与{ {1}}标志。)
对于#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>
等),等等。