【发布时间】:2014-05-14 14:08:04
【问题描述】:
我试图在一个教程网站上执行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> -> 成功了!
&#60s&#99ript&#62&#97lert("Hi")&#60/s&#99ript&#62 -> 没用! (在网页上打印为字符串)
所以基本上,如果我用 JavaScript 编码任何东西,它就可以工作。但是,如果我对任何 HTML 内容进行编码,它就不会在该 HTML 中执行 JavaScript!
【问题讨论】:
-
“我知道浏览器在解析 HTML 文档时会执行内联 JavaScript”,这是正确的,但您所拥有的不是内联 JavaScript,而是一个 onload 事件。
<script>alert("foobar!")</script>将是内联 javascript。属性确实会转换为字符串,其中 html 实体替换为实际字符,这就是页面加载警报有效的原因。 -
啊!我明白。感谢您的澄清。
-
-1?!太宽泛?!严重地?!我不认为这个问题太宽泛了。我只需要一个关于问题中提到的案例的答案。我不是要完整的渲染过程!
标签: javascript html firefox browser xss