POST 请求的 CSRF 检测,在服务器上进行内容类型验证

CSRF detection for POST request with content type validation at server

这是关于我试图作为 CSRF 漏洞 PoC 的一部分发出的 http 请求。通过服务器领域的 csrf 保护的明显方法不存在。

我尝试使用 XHR 对象来检查漏洞。但是服务器没有配置 CORS,正如在我的浏览器发出的 OPTIONS 预检请求中观察到的那样,随后的 POST 请求没有发生。

<html>
<title>JSON CSRF POC</title>
<body>
<center>
<h1> JSON CSRF POC </h1>
<script>fetch('<url here>', {method: 'POST', credentials: 'include', 
headers: {'Content-Type': 'application/json'}, body: '{<Payload in json  
format>}'});
</script>
<form action="#">
<input type="button" value="Submit" />
</form>
</center>
</body>
</html> 

在这里,我在第一个 运行 中将内容类型指定为 'plain/text'。但是服务器似乎也在检查内容类型并且请求出错了。正如上面代码中指定的,内容类型是 'application/json',这是服务器所期望的。但是当我 运行 代码时,请求被视为 XHR 并且不成功。我确实使用 "Auto-select based on the request features" 选项尝试了 csrf 的 burp PoC,期望生成的代码将具有截获请求中指定的内容类型。但是代码的内容类型设置为 plain/text。 PoC 代码还更改了服务器不接受的 url 编码格式的有效负载。如果我拦截由 burp PoC 生成的 http 请求并将内容类型更改为 "application/json" 和 json 格式的有效负载,则请求成功。

谢谢。

我的问题是:- 1. 将内容类型更改为 application/json 后,为什么浏览器将其视为 XHR 请求? 2. 有什么方法可以更改上面的代码,使浏览器不会将其视为 XHR [跨域]

  1. fetch 与 XHR 的实现类似,只是它的 API 使用 promises 来处理结果。同时浏览器也不支持表单提交的 JSON 内容类型。
  2. 您可以使用可以触发此类请求的 Flash swf 文件。请参阅下面的答案: https://security.stackexchange.com/questions/170477/csrf-with-json-post-when-content-type-must-be-application-json?answertab=votes#tab-top