https://www.informationsecurity.com.tw/seminar/2021twcert/
https://www.informationsecurity.com.tw/seminar/2021twcert/

觀點

控制入侵門道 安全無懈可擊So Easy

2005 / 09 / 26
林佳明
控制入侵門道  安全無懈可擊So Easy

伺服器應用程式
Buffer Overflow
這個弱點最常被使用也最容易修補、發現。因為伺服器開發廠商,對於參數大小忘了做確認,進而造成系統產生緩衝區溢位的弱點,讓入侵者可執行任意程式。修補方式僅需安裝修補程式即可。

MISConfiguration(配置失當)
每一種服務都會有設定方式,以及啟動功能。然而,網站管理者常常會因為對於設定的不了解,而開放過當的權限、或者功能。而這些失當的權限、功能,就可以被入侵者拿來利用。以下實例供作參考:
●目錄權限失當
網站伺服器對應的檔案目錄,提供過多的使用權限,導致入侵者有機會可以透過這些權限,執行、讀取、寫入特定的檔案。例如,Windows 2000預設將inetpub\wwwroot目錄給於everyone完全的控制權限(可以執行、讀取、寫入),造成任何惡意入侵者都有可能對網頁目錄進行任意的更動。
●提供功能失當
HTTP協定在1.1版之後,開始支援WebDAV(WebDAV﹐Web-based Distributed Authoring and Versioning)協定。這是一組由 HTTP/1.1 的功能延伸的通訊協定,讓用戶端發行(公佈資源讓他人使用)、鎖定、並管理 Web 上的資源,使得使用者們得以經由網頁共同編輯、整理、管理檔案資料。然而,在IIS 5.0上預設支援WebDAV的功能(Aapche可以安裝WebDAV套件來支援),設定網站發行目錄後,具有正確權限的使用者就可以將文件發行至伺服器中,並在目錄裡處理檔案。然而,由於使用者對於WebDav的不了解,因此常會不小心在開放權限上設定過鬆。例如,因為勾選IIS設定主目錄中的「寫入(W)」功能,導致入侵者可以使用WebDAV中的「PUT」指令上傳檔案到網頁伺服器中。
●元件配置失當
許多的網站管理者,使用install或者系統預設的安裝方式來安裝伺服器,然而,作業系統、安裝套件通常都會安裝過多使用不到的元件。例如,IIS中的FrontPage Server Extension是一套功能強大的網站管理軟體,支援FrontPage中的HTML 編輯製作;並擴充Web伺服器功能之程式及Script的集合,讓使用者可以快速地進行搬移檔案、檢查超連結等動作,管理整個網站。IIS透過Windows的存取控制來決定誰可以透過FrontPage來管理網站。Windows預設Everyone擁有檔案的完全控制權。於是,入侵者只要透過FrontPage這套網頁編輯軟體,就可以遠端任意編輯所屬的網站內容。
●範例檔配置失當
為了讓使用者更快了解如何編寫特定網頁程式的語言指令(asp、php、jsp等),許多的Web Server會在安裝中提供程式範例檔,有時範例檔會因為提供過大功能導致入侵者可以取得、執行額外的資訊。例如IIS中的showcode.asp可以觀看網頁目錄中任意ASP檔案的原始碼,而這些檔案通常會存放和後端資料庫相關的存放位址以及帳號、密碼。
●網頁編輯器失當
每一位程式撰寫人員都有偏好的網頁編輯器,有些常用的編輯器會自動產生備份檔,將敏感的資訊透露給入侵者。其中最常被使用的文字編輯器UltraEdit就會自動幫編輯檔案產生一個備份檔.bak,如果程式工程人員忘了將備份檔移除,入侵者就可以透過這個備份檔取得敏感的資料,像是資料庫的位址、密碼。


使用者輸入驗證上的錯誤
由於HTML協定只能單向的顯示網頁結果給使用者,無法和使用者產生互動的效果,於是動態式網頁程式因應而生,由最早的CGI程式一直到現在較流行的ASP、PHP、JSP等。由於這些程式都強調可以和使用者互動,可以接受使用者輸入資料。然而,如果沒有適當的處理使用者所輸入的資料,將可能影響網頁程式的運作,甚至入侵整個系統。以下實例供各位參考:
●SQL Injection
根據警方公佈的資料顯示,國內有八成網站都存有弱點。目前被翻譯成「資料隱碼」攻擊。因為程式寫作過程中沒有過濾SQL指令相關的字串,導致惡意的使用者可以利用修改過的SQL語法達到侵害資料庫的目的。如果有讓使用執行輸入的介面,卻又沒有針對輸入資料型態進行嚴密的管制,就有可能會遭受這種行為的攻擊。一般輸入帳號密碼的網站的SQL語法:
select * from member where UID =' "& request("ID")&" ' And Passwd =' "& request("Pwd") & " '
如果正常使用者帳號A123456789 ,密碼1234,SQL語法就換轉換如下:
select * from member where UID ='A123456789' And Passwd='1234'
輸入的帳號與密碼等資訊會取代ASP(or PHP、JSP)的變數,並由兩個單引號(' ')所包住。入侵者可以修改參數值如passwd='' or ''=''讓密碼驗證過關,也能透過參數的修改操作資料庫或執行特殊命令。
●XSS
許多網頁程式功能是將使用者輸入的資料,顯示在網站上(例如留言版功能)。然而,程式撰寫人員如果忽略HTML所使用的TAG,而讓使用者可以輸入HTML TAG的字串的話,可以讓惡意的使用者,讓無辜的使用者執行惡意的javascript程式。例如,某個網站的留言版功能,會將留言者的暱稱顯示在網頁上。在會員資料登錄的欄位,沒有過濾HTML語法,入侵者可以填入常見的windows.open(somelink)的javascrip語法,讓每一個觀看連言版使用者,都會再彈出一個網頁視窗,入侵者就可以利用這個彈出的視窗進行其他的攻擊。
●Code Injection
許多的網頁程式都會提供執行外部指令、開啟檔案的功能,如果執行的指令、開啟的檔案,可藉使用者所傳入的參數進行決定,將會導致使用者可以改變網頁程式執行的命令。有名的例子像是perl程式中的OPEN函數,入侵者可以使用來另外開啟、執行檔案或命令。
●路徑跳脫
有的網頁程式主要功能在顯示使用者想要觀看的程式內容,如果使用者可以決定程式要顯示哪些檔案,使用者可以使用「../」讀取網頁目錄外檔案,甚至是系統密碼檔。

程式邏輯上的錯誤
網頁程式都是由人所撰寫,而人會因為情緒波動、環境的更動而做出一些疏忽的程式碼。以下舉出一些邏輯上常犯的錯誤供各位參考:
●僅對使用者是否有權限讀取檔案作管理
這項重複發生的錯誤,問題發生主因在於,程式撰寫者,僅確認使用者有沒有權限使用某個檔案,卻沒有判斷使用者是否有讀取資料庫特定資料的權限。例如,使用者使用自己的帳號密碼登入網站後,可以使用觀看使用者基本資料功能看自己所留下的資料。也許程式是使用viewuser.php?id=22344來讀取編號22344會員的資料。然而,很多的程式撰寫者,僅判斷使用者是否有權限讀取viewuser.php此一檔案,卻忽略判斷使用者是否可以讀取編號22344的資料。於是,登入網頁的使用者,僅需更改LINK中的編號,便可以看到其他人的基本資料。
●僅對登入畫面做權限控管
對於需要使用者登入後才能使用功能,許多程式撰寫者僅對登入畫面做權限控管。天真以為每一位使用者都會正常透過登入畫面來得到後續功能的連結。當工程師忽略對登入後才能看到的連結做session管理,或權限上管理,會造成任意的使用者不需經過登入就直接使用該功能。有名的例子像是Trend Micro OfficeScan CGI Directory Insufficient Permissions Vulnerability就是。
●將重要的資料放在Form表單的隱藏欄位中
Form表單是HTML作交易傳遞最常被使用的方式,其中有一個Tag 可以用來傳遞隱藏的資料給下一個網頁。有的程式師透過這樣的欄位來傳遞重要的數據,例如產品的單價,入侵者只需要觀看網頁原始碼,就可以輕易的了解該資料,並將之變造影響程式的正常運作。
●使用教科書上的檔名、目錄
不諱言,沒有人生下來就會寫程式,但透過書本或網路文章都可以學習程式撰寫。但許多程式設計師會粗心地直接使用教科書上的範例,連檔名都沒有改。入侵者僅使用掃瞄程式,就可以掃瞄出是否有常見的檔案作為敏感資訊的取得。國內有名的例子像是opendb.inc。

程式輸出錯誤
程式的輸入必須留意不可以洩漏太多的資訊給使用者看到。像是利用SQL Injection所造成的錯誤訊息,常常就因為太過於詳細,讓入侵者可以得知資料庫的欄位格式、系統目錄配置等訊息。

密碼管制失當
程式設計師在撰寫網頁程式時,常會讓使用者(會員)可以自己決定自己的密碼,然而,卻沒有對密碼作嚴密的規定,或者程式設計師自己建立了一個測試的帳號,是用了空密碼。入侵者想要入侵某一個會員系統的話,就可以使用常見的帳號、密碼來嘗試是否存在這樣的帳號密碼。