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

时间:2014-05-14 14:08:04

标签: 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> - &gt;工作!

&#60s&#99ript&#62&#97lert("Hi")&#60/s&#99ript&#62 - &gt;没工作! (在网页上打印成字符串)

所以基本上,如果我在JavaScript中编码任何东西,它就可以了。但是,如果我编码任何HTML,那么它就不会在该HTML中执行JavaScript!

2 个答案:

答案 0 :(得分:2)

我无法用正确的词语来形容,所以我只想举个例子。让我们说我们有这个字符串:

<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; DR:

如果你正在使用的服务是剥离标签,除非脚本编写不当导致字符串被解析两次,否则你无能为力。

演示:http://jsfiddle.net/W6UhU/注意在设置div的内部html等于它的内部文本之后,跨度变为html元素而不是字符串。

答案 1 :(得分:1)

当HTML页面显示&#60body时,它会像处理&lt;body

一样对待它

也就是说,它只显示编码的字符,不会将它们解析为HTML。因此,您不会使用onload属性http://jsfiddle.net/SSfNw/1/

创建新代码
alert(document.body.innerHTML);
// When an HTML page says &lt;body It treats it the same as if it said &lt;body  

因此,在您的情况下,您永远不会创建一个正文标记,只是最终会被移入正文标记的内容http://jsfiddle.net/SSfNw/2/

alert(document.body.innerHTML)
// &lt;body onload="alert('Hi')"&gt;&lt;/body&gt;  

<body onload="&#97lert('Hi')"></body>的情况下,解析器能够创建body标签,一旦在body标签内,它也能够创建onload属性。进入属性后,所有内容都会被解析为字符串。