GB | BIG5
|
| 首頁 > 安全技術 > 程序 > 正文 |
 |
| 如何撰寫安全的CGI程式 |
| 本文出自:http://www.cert.org.tw 作者: (2001-11-02 08:00:01) |
前言
在我們(TWCERT)曾經遇過的WEB網站入侵事件裡,有部份的原因是撰寫了不安全的
CGI程式,然而要撰寫安全的CGI程式,其實不是一件很困難的事,在此將心得與大家分
享,本文主要以UNIX上的Web伺服器環境為主,若您有任何疑問,歡迎來信討論,我的
電子郵件信箱為: changiz@cert.org.tw。
1.CGI程式撰寫方面
(1)傳入的參數方面
*檢查傳入的參數*
不要認為你所收到的資料一定是正確的。一般攻擊者會試著傳送假資料,即使你將
所有可傳回的值,用選單方式讓使用者選取,攻擊者依然可傳送你預期外的資料給
CGI程式。
另外,使用"POST"的傳輸方式並不比用"GET"方式為安全,只是在瀏覽器上看不到傳
輸資料罷了,仔細想想,你要傳給CGI的參數是不是都寫在HTML檔裡呢?那麼,即
使你用"POST"的方式傳資料,攻擊者只要寫一些小程式,依然可假造傳輸資料。再
者,HIDDEN形態的參數(如下)也是一樣的道理。
<input type="hidden" name="env_report" value="REMOTE_HOST">
千萬別以為type="hidden"是絕對安全的。
所以呢,切記檢查傳回的參數,以確定是否為合法的資料。
*不要傳入目錄或檔案名稱*
若你欲使用CGI修改數個檔案或目錄,切記不可傳遞檔名,因為入侵者可以傳送你預
期外的檔名給CGI程式,所以最好以代號傳送給CGI程式,讓CGI依代號找出對應的
檔名。
另外,假如必須傳送檔案名或目錄名,必須注意"../"(上層目錄)的檢查,舉例來說,
假如你的CGI目錄為/web/cgi-bin/,而你傳回的檔名"/test.dat"表示系統絕對路
徑為"/web/cgi-bin/test.dat"的檔案,此時若入侵者傳回"../log/logs"而CGI程式
沒做檢查,入侵者就可能修改到"/web/log/logs"這個檔。
(2)程式的緩區長度
如果程式沒檢查存放資料的記憶體長度,是否能完全存放傳入資料,那就可能被攻擊者
以Buffer overflow攻擊。所以,當你要存放傳入資料時,不彷參考以下程式(C語言):
file://使用POST方法傳遞資料時的資料讀取
int bfsize=atoi(getenv("CONTENT_LENGTH")); file://取得資料長度
char* data_string = (char*) malloc(bfsize); file://取得適當的記憶體
if (data_string != NULL)
read(STDIN,data_string,bfsize); file://將資料存放於記憶體中
當然,你也可以檢查資料長度是否超過你的緩區大小,如果超過的話,
就結束程式,這樣也可以避免Buffer Overflow攻擊。
(3)鎖定寫入的資料檔
這是一般的問題,通常在資料庫上都會碰到,亦即當可能有多個使用者同時存取檔案
時,為了避免資料寫入錯誤與達到資料的一致性,都必須做鎖定(Lock)的動作。
2.CGI程式系統設定方面
(1)開放CGI於任何目錄的注意事項
Server中有個(AddHandler cgi-script .cgi)設定,可將每個目錄中的*.cgi都當成
CGI程式執行。若你開啟了這個設定,而你的伺服器又允許每個使用者再自己的目錄
下撰寫網頁,並且網頁擁有者與Web Server的執行者相同,那就有可能被使用者藉
由CGI程式來修改網頁。解決方法是不要讓檔案目錄的擁有者與WEB伺服器的執行者
相同。例如Web Server執行時會變成"nobody",那就可以將網頁資料的擁有者設成
"root",或是其它不是"nobody"的帳號。
(2)CGI程式的Setuid屬性的使用
注意是否有setuid的CGI程式存在,一般的情況下是不需要setuid的。
當然有些情形是例外,比方你允許所有使用者能存放CGI程式於使用者目錄,而你的網
頁又提供CGI所做的留言板,此時使用者可能透過自己寫的CGI程式,來修改甚至置換
整個留言板內容,此時你就可以將留言板的CGI程式擁有者改成另一個使用者帳號(千
萬別用root),並開啟setuid,如此可避免掉上述問題。
(http://www.fanqiang.com)
進入【UNIX論壇】
|
|
| 相關文章 |
如何撰寫安全的CGI程式 (2001-11-02 08:00:01) CGI編程的COOKIE技術應用 (2001-08-24 07:00:00) Perl源碼:一種圖形顯示式計數器CGI程序范例 (2001-08-23 15:00:00) Perl源碼:分頁顯示CGI程序范例 (2001-08-23 12:00:01) Perl源碼:在線人數統計CGI程序剖釋 (2001-08-23 10:00:01) Perl源碼:日歷CGI程序淺解 (2001-08-23 09:00:01) PERL CGI簡介及指令示范 (2001-08-22 12:00:00) CGI與WEB服務器的響應頭 (2001-08-22 10:00:00) 編寫關SendMaild的CGI (2001-08-21 08:00:00) 實戰FastCGI (2001-08-21 07:00:00)
|
===更多相關=== |
|
|
 |
★ 樊強制作 歡迎分享 ★ |