官术网_书友最值得收藏!

2.1.5 活動代碼或者移動代碼

活動代碼(Active Code)或者移動代碼(Mobile Code)是對被“推入”到客戶端執行的代碼的統稱。網頁服務器為什么要浪費寶貴的資源和帶寬去做那些客戶工作站能做的簡單工作呢?例如,假設想讓你的網站上出現一些熊跳著舞跨過頁面頂部的畫面。為了下載這些正在跳舞的熊,你可能會在這些熊每一次運動的時候下載一幅新圖片;向前移動一點,再向前移動一點,如此繼續下去。然而,這種方法占用了服務器太多的時間和帶寬,因為需要服務器帶來計算這些熊的位置并下載很多新的圖片。一種更有效利用(服務器)資源的方式是直接下載一個實現熊運動的程序,讓它在客戶端計算機上即可運行。

下面介紹不同種類活動代碼的相關潛在弱點。

1.Cookie

嚴格來說,Cookie不是活動代碼,而是一些數據文件,遠程服務器能夠存入或獲取Cookie。然而,由于Cookie的使用可能造成從一個客戶端到服務器的不期望的數據傳送,所以它的一個缺點就是失去了機密性。

Cookie是一個數據對象,可以存放在內存中(一次會話Cookie),也可以為將來使用而存儲在磁盤上(持久Cookie)。Cookie可以存儲瀏覽器允許的與客戶端相關的任何內容:用戶按鍵、機器名稱、連接詳細內容(如IP地址)、日期和類型等。在服務器命令控制下,瀏覽器將Cookie的內容發送給服務器。一次會話Cookie在關閉瀏覽器的時候被刪除,而持久Cookie卻可以保留一段預先設定的日期,可能是未來的幾年時間。

Cookie為服務器提供了一個上下文。通過使用Cookie,某些主頁可以使用“歡迎回來,James Bond”這樣的歡迎詞來對用戶表示歡迎,或者反映用戶的一些選擇,如“我們將把該訂單上的貨物郵寄到Elm大街135號,對嗎?”但是,正如以上兩個例子所顯示的那樣,任何人只要擁有了某人的Cookie,他在某些情形中就代表著這個人。這樣,任何人只要竊聽或者獲得了一個Cookie,就可以冒充該Cookie的所有者。

Cookie中究竟包含著關于用戶的哪些信息呢?盡管這些都是用戶的信息,但絕大多數時間用戶都不會知道Cookie里邊到底是什么內容,因為Cookie的內容是使用一個來自服務器的密鑰加過密的。

因此,Cookie會占用用戶的磁盤空間,保存著一些用戶不能看到但與用戶相關的信息,能傳遞給服務器但用戶不知道服務器什么時候想要它,服務器也不會通知用戶。

2.腳本

客戶可以通過執行服務器上的腳本來請求服務。通常情況是,網頁瀏覽器顯示一個頁面,當用戶通過瀏覽器與網站進行交互時,瀏覽器把用戶輸入的內容轉化成一個預先定義好的腳本中需要的參數,然后,它發送這個腳本和參數給服務器執行。但是,所有通信都是通過HTML來進行的,服務器不能區分這些命令到底是來自一個瀏覽器上的用戶完成一個主頁后提交的,還是一個用戶手工寫出來的。一些懷有惡意的用戶可能會堅持觀察一個瀏覽器與服務器之間的通信,觀察怎樣改變一個網頁條目可以影響瀏覽器發送的內容,觀察其后服務器會做出何種反應。具備了這些“知識”,懷有惡意的用戶就可以操縱服務器的活動了。

來看看這種操縱活動有多么容易。首先,要記住程序員們通常不能預見到的惡意舉動;事實正好相反,程序員們認為用戶都是合法的,會按照程序預先設定的操作規程來使用一個程序。正是由于這個原因,程序員們常常忽略過濾腳本參數,以保證用戶的操作是合理的,而且執行起來也是安全的。一些腳本允許包含到任何文件中,或者允許執行任何命令。攻擊者可以在一個字符串中看到這些文件或命令,并通過改變它們來做一些實驗。

一種廣為人知的針對網頁服務器的攻擊方式是Escape字符(Escape-Character)攻擊。一種常用于網頁服務器的腳本語言——公共網關接口(Common Gateway Interface,CGI)定義了一種不依賴于具體機器的方法來對通信數據編碼。按照編碼慣例,使用%nn來代表特殊的ASCII字符。例如,%0A(行結束)指示解釋器將緊接著的一些字符當作一個新的命令。下面的命令是請求復制服務器的密碼文件:

http://www.test.com/cgi-bin/query?%0a/bin/cat%20/etc/passwd

CGI腳本也可以直接在服務器上啟動一個動作。例如,如果攻擊者觀察到一個CGI腳本中包含著如下格式的一個字符串:

<!--#action arg1=value arg2=value -->

則攻擊者用以下字符串替代上述字符串后,提交一個命令:

<! --#exec cmd="rm *"-->

這就會引起命令行解釋器執行一個命令刪除當前目錄下的所有文件。

微軟的動態服務器頁面(Active Server Page,ASP)也具有像腳本一樣的能力。這些頁面指導瀏覽器怎樣顯示文件、維護上下文以及與服務器交互。因為它們在瀏覽器端也可以被看到,所以任何存在于ASP代碼中的編程漏洞都可以用于偵查和攻擊。

服務器永遠不要相信來自客戶端的任何東西,因為遠程用戶可以向服務器發送手工寫出來的字符串,用以代替由服務器發送給客戶端的惡意程序。正是由于有如此多的遠程訪問方式,所有這些例子證明了這樣一點:如果某用戶允許其他人在他的機器上運行程序,那他的機器就不會有絕對的安全保障。

3.活動代碼

通過以下幾個步驟可以開始顯示主頁:產生文本,插入圖片,并通過鼠標單擊來獲取新頁。很快,人們就在他們的站點上使用了一些精心設計的內容:蹣跚學步的孩子在頁面上跳舞、三維旋轉的立方體、圖片時隱時現、顏色不斷改變,以及顯示總數等。其中,特別是涉及運動的小技巧顯然會占用重要的計算能力,還需要花費大量時間和通信資源從服務器上把它們下載到客戶端。然而,通常情況下,客戶端自身有一個有能力卻沒有充分利用的處理器,因此,無須擔心活動代碼占用客戶端計算時間的問題。

為了充分利用處理器的能力,服務器可以下載一些代碼到客戶端去執行。這些可執行代碼稱為活動代碼(Active Code)。兩種主要的活動代碼是Java代碼(Java Code)和ActiveX控件(ActiveX Control)。

(1)Java代碼。敵意的Applet(Hostile Applet)是一種可以下載的Java代碼,會對客戶系統造成損害。由于Applet在下載以后失去了安全保護,而且通常以調用它的用戶的權限運行,因此敵意的Applet會造成嚴重破壞。Dean等列舉了安全執行Applet的幾種必要條件:

● 系統必須控制Applet對重要系統資源的訪問,如文件系統、處理器、網絡、用戶顯示和內部狀態變量等。

● 編程語言必須通過阻止偽造內存指針和數組(緩沖區)溢出來保護內存。

● 在創建新對象時,系統必須通過清除內存內容來阻止對象的重用;在不再使用某些變量時,系統應該使用垃圾回收機制來收回所占用的內存。

● 系統必須控制Applet之間的通信,以及控制Applet通過系統調用對Java系統外的環境產生的影響。

(2)ActiveX控件。微軟公司針對Java技術的應對措施是ActiveX系列。使用ActiveX控件以后,任何類型的對象都可以下載到客戶端。如果該客戶端有一個針對這種對象類型的閱讀器或者處理程序,就可以調用該閱讀器來顯示這個對象。例如,下載一個微軟Word的.doc文件就會調用系統上安裝的Word程序來顯示該文件。對于那些客戶端沒有相應處理程序的文件將會導致下載更多的其他代碼。正是由于這個特點,從理論上來說,攻擊者可以“發明”一種新的文件類型,如稱為.bomb類型,就會導致那些毫無戒心的用戶在下載一個包含.bomb文件的主頁時,也隨同下載了可以執行.bomb類文件的代碼。

為了阻止任意下載文件,微軟公司使用了一種鑒別方案,在這種鑒別方案下,下載的代碼是有密碼標記的,而且在執行前需要驗證簽名。但是,鑒別驗證的僅僅是源代碼,而不是它們的正確性或者安全性。來自微軟公司的代碼并不是絕對安全的,具有未知來源的代碼可能會更加安全,但也可能更不安全。以前的事實證明,不論代碼來自何處,用戶都不能假設它到底有多好或者有多安全。況且,有些弱點還可以允許ActiveX繞過這種鑒別。

4.根據類型自動執行

數據文件是通過程序進行處理的。對于某些產品而言,文件類型是通過文件的擴展名來表示的,如擴展名為.doc的文件是一個Word文檔,擴展名為.pdf,即可移植文檔格式(Portable Document Format)的文件是一個Adobe Acrobat文件,而以.exe為擴展名的文件是一個可執行文件。

把一個Word文檔本身當作一個可執行文件是讓人難以理解的。為了阻止人們通過輸入名字作為命令來運行文件Temp.doc,微軟公司在文件中內置了它的真實類型。只需要在Windows文件瀏覽器窗口中雙擊該文件,就可以激活相應的程序來處理這個文件。

但是,這種方案也為攻擊者提供了一個機會。一個“懷有惡意”的代理可能會給用戶發送一個名為innocuous.doc的文件,使用戶以為它是一個Word文檔。由于它的擴展名是.doc,因此Word程序會試圖打開它。假設該文件被重命名為innocuous(沒有擴展名.doc),但如果內置的文件類型是.doc,那么雙擊innocuous也會激活Word程序打開該文件。這個文件中可能包含著一些不懷好意的宏命令,或者通過請求打開另一個更危險的文件。

在通常情況下,可執行文件是危險的,而文本文件相對比較安全,一些帶有活動內容的文件(如.doc文件)介于兩者之間。如果一個文件沒有明顯的文件類型,將會使用它內置的文件處理程序來打開。攻擊者經常使用沒有明顯文件類型的方法來隱藏一個“懷有惡意”的活動文件。

主站蜘蛛池模板: 光泽县| 正安县| 昌宁县| 齐齐哈尔市| 竹溪县| 伊金霍洛旗| 神农架林区| 乐昌市| 博爱县| 高阳县| 临夏市| 昌都县| 五华县| 太和县| 夏邑县| 南康市| 斗六市| 同德县| 永兴县| 建湖县| 肃北| 合川市| 集安市| 丹寨县| 霍州市| 泗阳县| 镇远县| 安阳县| 格尔木市| 平陆县| 蕲春县| 韩城市| 同心县| 临夏县| 井陉县| 阳城县| 新巴尔虎左旗| 梧州市| 綦江县| 阿瓦提县| 周至县|