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

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

当我尝试:

<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!

最佳答案

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


因此,就您而言,您永远不会创建body标签,只是最终将内容移入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属性。进入属性后,所有内容都将解析为字符串。

10-05 20:38
查看更多