看到一个POST为JSON格式的CSRF,并且验证了Content-Type是否是application/json,构造发现:

  • 使用form能构造出JSON的跨域请求,但是无法设置Content-Type。
  • 使用XMLHttpRequest或fetch能构造出JSON请求并能设置Content-Type,但是无法跨域。

POC存在两种场景:

  • JSON CSRF(未验证Content-Type)
  • JSON CSRF(验证Content-Type)

JSON CSRF(未验证Content-Type)

使用From构造POC

<html>
<title>JSON CSRF POC</title>
<form action=”http://xxx.com” method=”POST” enctype=”text/plain” >
<input name='{“name”:”attacker”,”email”:”attacker@gmail.com”,“ignore_me”:”‘ value=’test”}‘ type=’hidden’>
</form>
<script>
document.forms[0].submit(); </script>
</html>

form的enctype参数不能设置位Content-Type。

该POC利用多一个key value的形式,去闭合多余的符号。如果存在CSRF的漏洞页面能识别多余的key value,那么这种方式是可行的。

JSON CSRF(验证Content-Type)

一.Flash的调用及域

1、html调用flash,flash可以改后缀名。
2、flash可以单独访问,但是其效果类似与html调用同域的flash,但只这个后缀必须是swf。
3、flash发动请求时,是根据flash的域来判断的,而不是html来判断:
4、flash请求同域资源时,直接忽视crossdomain.xml。
5、flash请求外域资源时,受外域下crossdomain.xml里的策略限制。

二.flash的调用与Referer

html调用外域的flash时,flash发送的请求的Referer是flash的,而不是html的。

利用flash的跨域 + 307跳转来构造POC

  • 能发起HTTP请求的swf文件(csrf_json.swf)
  • 307跳转(307.php)
  • 上面两个文件同域

当访问最后的POC,过程如下:

  1. 受害者访问POC,向attacter.com发起一条swf请求,swf向307.php发送HTTP POST请求。
  2. attacter.com的307.php发起307跳转,跳转到victim.com,注意307跳转会带着http请求方式,header和postdata进行跳转。
  3. victim.com收到一条POST请求,并且Content-Type为application/json。
  4. victim.com收到一条/crossdomain.xml请求。由于第三步优先第四步执行,导致跨域。并且victim.com能收到crossdomain.xml请求,也证明了第三步的POST请求是Flash发出,而不是307.php发出。因为307.php单独发出的post请求不会主动请求crossdomain.xml。

服务器A的Flash如果要向B发起一条HTTP请求,会先请求服务器B的crossdomain.xml文件,判断是否能跨域,如果文件没有,或者xml文件设置不能跨域,则不能跨域

参考:

http://www.appsecweekly.com/flash-same-origin-policy-bypass-with-307/

Exploiting JSON Cross Site Request Forgery (CSRF) using Flash