Flash安全的一些總結

wyzsk發表於2020-08-19
作者: 只抽紅梅 · 2013/06/27 12:37

整理了下Flash安全相關的知識,後面會再完善 

一、先來說crossdomain.xml這個檔案


flash如何跨域通訊,全靠crossdomain.xml這個檔案。這個檔案配置在服務端,一般為根目錄下,限制了flash是否可以跨域獲取資料以及允許從什麼地方跨域獲取資料。

比如下面的列子: 1、www.a.com域下不存在crossdomain.xml檔案,則不允許除了www.a.com域之外的其他任何域下的flash進行跨域請求。

2、www.a.com域下存在crossdomain.xml檔案,如若配置 allow-access-from 為www.b.com,則只允許www.b.com域下的flash進行跨域請求,以及來自自身域www.a.com的網路請求。 crossdomain.xml需嚴格遵守XML語法,有且僅有一個根節點cross-domain-policy,且不包含任何屬性。在此根節點下只能包含如下的子節點:

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

site-control

早期的flash允許從其他位置載入自定義的策略檔案,目前最新版的flash在接受自定義的策略檔案之前會去檢查主目錄的crossdomain.xml來判斷是否接受自定義策略檔案。該選項就由site-control進行控制。

不加該選項時,預設情況下flash不載入除主策略檔案之外的其他策略檔案,即只接受根目錄下的crossdomain.xml,這樣可以防止利用上傳自定 義策略檔案進行的攻擊。如果需要啟用其他策略檔案,則需要配置permitted-cross-domain-policies屬性,該屬性有以下五個 值: none: 不允許使用loadPolicyFile方法載入任何策略檔案,包括此主策略檔案。

master-only: 只允許使用主策略檔案[預設值]。
by-content-type:只允許使用loadPolicyFile方法載入HTTP/HTTPS協議下Content-Type為text/x-cross-domain-policy的檔案作為跨域策略檔案。
by-ftp-filename:只允許使用loadPolicyFile方法載入FTP協議下檔名為crossdomain.xml的檔案作為跨域策略檔案。
all: 可使用loadPolicyFile方法載入目標域上的任何檔案作為跨域策略檔案,甚至是一個JPG也可被載入為策略檔案!

例子:

<site-control permitted-cross-domain-policies="by-content-type" > 

允許透過HTTP/HTTPS協議載入http頭中Content-Type為text/x-cross-domain-policy的檔案作為策略檔案

<site-control permitted-cross-domain-policies="all" > 

允許載入任意檔案作為策略檔案

allow-access-from

該選項用來限制哪些域有許可權進行跨域請求資料。

allow-access-from有三個屬性

domain:有效的值為IP、域名,子域名代表不同的域,萬用字元*單獨使用代表所有域。萬用字元作為字首和域名進行組合代表多個域,比如*.weibo.com,代表weibo.com所有的子域。
to-ports:該屬性值表明允許訪問讀取本域內容的socket連線埠範圍。可使用to-ports="1100,1120-1125"這樣的形式來限定埠範圍,也可使用萬用字元(*)表示允許所有埠。
secure:該屬性值指明資訊是否經加密傳輸。當crossdomain.xml檔案使用https載入時,secure預設設為true。此時將不允許flash傳輸非https加密內容。若手工設定為false則允許flash傳輸非https加密內容。

例子

http://a.com/crossdomain.xml檔案內容如下

<cross-domain-policy > 
    <allow-access-from domain="*.b.com" secure="true" />
</cross-domain-policy > 

允許所有qq.com的子域透過https對t.qq.com域進行跨域請求。

allow-access-from-identity

該節點配置跨域訪問策略為允許有特定證照的來源跨域訪問本域上的資源。每個allow-access-from-identity節點最多隻能包含一個signatory子節點。

allow-http-request-headers-from

此節點授權第三方域flash向本域傳送使用者定義的http頭。

allow-http-request-headers-from包含三個屬性:

domain:作用及引數格式與allow-access-from節點中的domain類似。
headers:以逗號隔開的列表,表明允許傳送的http頭。可用萬用字元(*)表示全部http頭。
secure:作用及用法與allow-access-from節點中的secure相同。

注:Flash 在自定義HTTP頭中無法使用下列請求標題,並且受限制的詞不區分大小寫(例如,不允許使用 Get、get 和 GET)。 另外,如果使用下劃線字元,這也適用於帶連字元的詞(例如,不允許使用 Content-Length 和 Content_Length):

Accept-Charset、Accept-Encoding、Accept-Ranges、Age、Allow、Allowed、Authorization、Charge-To、Connect、Connection、Content-Length、Content-Location、Content-Range、Cookie、Date、Delete、ETag、Expect、Get、Head、Host、Keep-Alive、Last-Modified、Location、Max-Forwards、Options、Post、Proxy-Authenticate、Proxy-Authorization、Proxy-Connection、Public、Put、Range、Referer、Request-Range、Retry-After、Server、TE、Trace、Trailer、Transfer-Encoding、Upgrade、URI、User-Agent、Vary、Via、Warning、WWW-Authenticate 和 x-flash-version。

二、web應用中安全使用flash


設定嚴格的crossdomain.xml檔案可以提高服務端的安全性,在web應用中也會經常使用flash,一般是透過<object>或者<embed>來進行呼叫,例如下面:

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0"name="Main" width="1000" height="600" align="middle" id="Main" >
<embed flashvars="site=&sitename=" src='Loading.swf?user=453156346&key=df57546b-c68c-4fd7-9f9c-2d105905f132&v=10950&rand=633927610302991250' width="1000" height="600"align="middle" quality="high" name="Main" allowscriptaccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" >
</object > 

<embed src="http://www.xxx.com/Loading.swf" allowScriptAccess="sameDomain" type="application/x-shockwave-flash>

flash是直接可以執行js程式碼的,所以在web應用中如果使用不當也會很危險,所以flash使用下面兩個屬性來保證引用flash時的安全性。

allowScriptAccess 和 allowNetworking

allowScriptAccess用來控制flash與html的通訊,可選的值為:

always //對與html的通訊也就是執行javascript不做任何限制
sameDomain //只允許來自於本域的flash與html通訊,這是預設值
never //絕對禁止flash與頁面的通訊

allowNetworking用來控制flash與外部的網路通訊,可選的值為:

all //允許使用所有的網路通訊,也是預設值
internal //flash不能與瀏覽器通訊如navigateToURL,但是可以呼叫其他的API
none //禁止任何的網路通訊

在allowNetworking設定為internal時,下面API將會被禁止使用:

fscommand()
navigateToURL()
ExternalInterface.call()

在allowNetworking設定為none時,下面API將會被禁止使用:

sendToURL()
FileReference.download()
FileReference.upload()
Loader.load()
LocalConnection.connect()
LocalConnection.send()
NetConnection.connect()
URLStream.load()
NetStream.play()
Security.loadPolicyFile()
SharedObject.getLocal()
SharedObject.getRemote()
Socket.connect()
Sound.load()
URLLoader.load()
XMLSocket.connect()

在web應用中使用flash的時候一般透過設定這兩項即可保證安全性,如果在web應用中使用的flash為使用者可控,強烈建議這兩項的設定值為

allowScriptAccess=never allowNetworking=none

三、flash安全程式設計

如果web應用中呼叫flash時設定的allowScriptAccess為never、allowNetworking為none,即使flash檔案 本身存在漏洞也可以忽略。不過事實上大部分web應用不會設定這兩項屬性,甚至會設定的不安全,比如allowScriptAccess為always、 allowNetworking為all。所以在進行flash開發的時候就要考慮好安全性。

flash程式設計不安全可導致兩方面的漏洞:

1、透過ExternalInterface.call()執行javascript程式碼 
2、透過loadMovie()等方式可以載入外部flash檔案執行 

這兩類問題都是需要透過引數接收外面傳入的資料,在flash內部沒有對資料進行嚴格的控制造成的。

例子:

this.movieName = root.loaderInfo.parameters.movieName;
this.flashReady_Callback = "SWFUpload.instances[\"" + this.movieName + "\"].flashReady";
ExternalCall.Simple(this.flashReady_Callback);
public static function Simple(arg0:String){
    ExternalInterface.call(arg0);
    return;
}

接收到外部傳入的movieName沒有進行處理,最後透過ExternalInterface.call()進行執行,這樣就能夠執行任意的javascript程式碼,如果在呼叫flash的時候設定的不夠安全就是XSS漏洞。

所以在flash程式設計中如果需要透過引數接收外部傳入的資料,一定要對資料進行嚴格的檢查,這樣才能保證flash安全性。

參考文件:

Flash應用安全規範 http://www.80sec.com/flash-security-polic.html

flash跨域策略檔案crossdomain.xml配置詳解 http://hi.baidu.com/cncxz/blog/item/7be889fa8f47a20c6c22eb3a.html

Cross-domain Policy File Specification http://www.senocular.com/pub/adobe/crossdomain/policyfiles.html

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章