我试图在教程网站上进行Reflective XSS攻击。该网页基本上由带有输入字段和提交按钮的表单组成。提交表单时,输入字段的内容显示在同一网页上。
我发现该网站正在将脚本标记和一些JavaScript方法列入黑名单,以防止XSS攻击。因此,我决定对输入内容进行编码,然后尝试提交表单。我尝试了2种不同的输入,其中一种有效,另一种则无效。
当我尝试:
<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!
最佳答案
HTML页面显示<body
时,将其视为与<body
相同
也就是说,它仅显示编码的字符,而不将其解析为HTML。因此,您不会使用onload
属性http://jsfiddle.net/SSfNw/1/创建新标签
alert(document.body.innerHTML);
// When an HTML page says <body It treats it the same as if it said <body
因此,就您而言,您永远不会创建body标签,只是最终将内容移入body标签http://jsfiddle.net/SSfNw/2/
alert(document.body.innerHTML)
// <body onload="alert('Hi')"></body>
在
<body onload="alert('Hi')"></body>
的情况下,解析器能够创建body标记,一旦位于body标记内,它还能够创建onload属性。进入属性后,所有内容都将解析为字符串。