我试图在教程网站上执行Reflective XSS攻击。该网页基本上由一个带有输入字段和提交按钮的表单组成。提交表单时,输入字段的内容显示在同一网页上。
我发现该网站将脚本标记和一些JavaScript方法列入黑名单以防止XSS攻击。所以,我决定对输入进行编码,然后尝试提交表单。我尝试了两个不同的输入,其中一个工作,另一个没有。
当我尝试时:
<body onload="alert('Hi')"></body>
它工作,并显示一个警告框。但是,我在HTML标记中编码了一些字符,如:
<body onload="alert('Hi')"></body>
它不起作用!它只是在网页上打印<body onload="alert('Hi')"></body>
!
我知道浏览器在解析HTML文档时执行内联JavaScript(如果我错了,请纠正我)。但是,我无法理解为什么浏览器会针对我提到的不同输入显示不同的行为。
----------------------------------------------- - - - - - - - 编辑 - - - - - - - - - - - - - - - - - - ----------------------
我厌倦了更基本的XSS教程,没有XSS保护。再次:
<script>alert("Hi")</script>
- &gt;工作!
<script>alert("Hi")</script>
- &gt;没工作! (在网页上打印成字符串)
所以基本上,如果我在JavaScript中编码任何东西,它就可以了。但是,如果我编码任何HTML,那么它就不会在该HTML中执行JavaScript!
答案 0 :(得分:2)
我无法用正确的词语来形容,所以我只想举个例子。让我们说我们有这个字符串:
<div>Hello World! <span id="foo">Foobar</span></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页面显示<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
因此,在您的情况下,您永远不会创建一个正文标记,只是最终会被移入正文标记的内容http://jsfiddle.net/SSfNw/2/
alert(document.body.innerHTML)
// <body onload="alert('Hi')"></body>
在<body onload="alert('Hi')"></body>
的情况下,解析器能够创建body标签,一旦在body标签内,它也能够创建onload属性。进入属性后,所有内容都会被解析为字符串。