javascript - 浏览器如何在编码标签内呈现此内联 JavaScript?

标签 javascript html firefox browser xss

我试图执行 Reflective XSS对教程网站的攻击。该网页基本上由带有输入字段和提交按钮的表单组成。提交表单后,输入字段的内容将显示在同一网页上。

我发现该网站将脚本标签和一些 JavaScript 方法列入黑名单,以防止 XSS 攻击。因此,我决定对我的输入进行编码,然后尝试提交表单。我尝试了两种不同的输入,其中一种有效,另一种无效。

当我尝试时:

<body onload="&#97lert('Hi')"></body>

它起作用了并且显示了一个警报框。但是,我在 HTML 标记中编码了一些字符,例如:

&#60body onload="&#97lert('Hi')"&#62&#60/body&#62

没成功!它只是打印 <body onload="alert('Hi')"></body>就像网页上一样!

我知道浏览器在解析 HTML 文档时会执行内联 JavaScript(如果我错了,请纠正我)。但是,我无法理解为什么浏览器对我提到的不同输入显示不同的行为。

------------------------------------------------------------ - - - - - - - 编辑 - - - - - - - - - - - - - - - - - - ----------------------

我对没有 XSS 保护的更基本的 XSS 教程也感到厌倦。再次:

<script>alert("Hi")</script> -> 成功了!

&#60s&#99ript&#62&#97lert("Hi")&#60/s&#99ript&#62 -> 没用! (在网页上以字符串形式打印)

基本上,如果我用 JavaScript 编码任何内容,它就可以工作。但是,如果我对任何 HTML 内容进行编码,它不会在该 HTML 中执行 JavaScript!

最佳答案

我无法想出合适的语言来描述,所以我只能举个例子。假设我们有这个字符串:

<div>Hello World! &lt;span id="foo"&gt;Foobar&lt;/span&gt;</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/

相关文章:

javascript - 从数组加载时如何分类

javascript - 如何将html文件用作div

javascript - Google Analytics 片段导致 Linux Firefox 中的页面刷新

javascript - EasyAutocomplete 的自定义匹配公式

javascript - 什么时候将逻辑从 VM 移动到 Knockout 中的自定义绑定(bind)更合适?

javascript - IE 9 错误 - 'SCRIPT600 : Invalid target element for this operation

javascript - 如何跨多个浏览器窗口从现有页面拆分 DOM?

javascript - 链接 html 和 javascript 以使答题器工作?

javascript - Firefox 在哪里存储 javascript/HTML localStorage?

jquery - Firefox 带有 $.ajax 的空 POST