JSON情景下的XSRF攻击
限制条件
当网站的CSRF漏洞点使用的是json数据格式的时候,进行CSRF有诸多限制
- 发送的数据需要为JSON格式,使用HTML表单难以构造发送JSON格式数据
- Content-Type校验,使用XMLHttpRequests会向服务器发送OPTIONS预检请求
方法1
当服务器没有对Content-Type进行检测的时候,这意味着我们可以发送格式为text的数据。那么唯一的难题就是使用HTML表单构造JSON格式数据。
解决方法是为表单添加添加一组无效的键值对。
假设正常发送的表单为
1 | { |
而我们通常的HTML表单构造代码为
1 | <html> |
发送数据的格式为
1 | name=attacker |
明显是不符合JSON格式的数据,服务器不会做出正确的回应。如果服务器不介意我们多传入一组键值对,那么就可以用下面的方法通过HTML表单传送数据时自动添加的=
闭合JSON数据。
1 | <html> |
发送的数据格式为
1 | { |
成功构造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 |
|
此时只需要让用户请求这个Flash文件即可。
还有一种更加简单的方法,在github上有人写好了更加灵活,复用性更强的攻击方法,也是用Flash来进行绕过。不同的是不预先编辑Flash,而是根据用户的URL中参数来赋予Flash文件变量,然后触发307传递JSON数据。链接在这。