我试图执行 Reflective XSS对教程网站的攻击。该网页基本上由带有输入字段和提交按钮的表单组成。提交表单后,输入字段的内容将显示在同一网页上。
我发现该网站将脚本标签和一些 JavaScript 方法列入黑名单,以防止 XSS 攻击。因此,我决定对我的输入进行编码,然后尝试提交表单。我尝试了两种不同的输入,其中一种有效,另一种无效。
当我尝试时:
<body onload="alert('Hi')"></body>
它起作用了并且显示了一个警报框。但是,我在 HTML 标记中编码了一些字符,例如:
<body onload="alert('Hi')"></body>
没成功!它只是打印 <body onload="alert('Hi')"></body>
就像网页上一样!
我知道浏览器在解析 HTML 文档时会执行内联 JavaScript(如果我错了,请纠正我)。但是,我无法理解为什么浏览器对我提到的不同输入显示不同的行为。
------------------------------------------------------------ - - - - - - - 编辑 - - - - - - - - - - - - - - - - - - ----------------------
我对没有 XSS 保护的更基本的 XSS 教程也感到厌倦。再次:
<script>alert("Hi")</script>
-> 成功了!
<script>alert("Hi")</script>
-> 没用! (在网页上以字符串形式打印)
基本上,如果我用 JavaScript 编码任何内容,它就可以工作。但是,如果我对任何 HTML 内容进行编码,它不会在该 HTML 中执行 JavaScript!
最佳答案
我无法想出合适的语言来描述,所以我只能举个例子。假设我们有这个字符串:
<div>Hello World! <span id="foo">Foobar</span></div>
解析后,您最终会得到一个包含文本的 div 元素:
Hello World! <span id="foo">Foobar</span>
请注意,虽然文本中有一些看起来像 html 的内容,但它仍然只是文本,而不是 html。为了使该文本成为 html,必须再次解析它。
属性的工作方式有点不同,属性中的 html 实体确实会在第一次被解析。
tl;博士:
如果您使用的服务正在剥离标签,则您无能为力,除非脚本编写得不好,导致字符串被解析两次。
演示:http://jsfiddle.net/W6UhU/请注意,在将 div 的内部 html 设置为等于其内部文本后,span 变成了 html 元素而不是字符串。
关于javascript - 浏览器如何在编码标签内呈现此内联 JavaScript?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23657059/