CGI的安全問題
CGI中最常見的漏洞是由于未驗證用戶輸入參數而引起的問題。CGI腳本一般從URL 、表單或路徑信息(Path Information)中獲取用戶的請求信息。Web程序開發人員容易習慣性認為用戶會按照要求的格式輸入數據,并在這個假定的前提下開發程序,而當這個前提沒有滿足時,程序的控制邏輯就可能發生錯誤。對于攻擊者來說,他們總能找到一些開發人員未料到的發送數據的方法。
CGI程序中經常會使用路徑信息填充PATH_INFO或其他環境變量,路徑信息通常指Web服務器上的那些如配置文件、臨時文件或者被腳本因問題調用的文件等此類不用變更的參數。但 PATH_INFO 變量是可以通過其他方式修改的,因而在使用時必須小心地驗證其內容,盲目地根據PATH_INFO指定的路徑文件進行操作的CGI腳本可能會被惡意用戶利用。
例如,某個CGI腳本的功能是打印PATH_INFO中引用的文件,腳本程序如下所示:
源碼復制打印
#!/bin/sh
#Send the header
echo "Content-type:text/html"
echo ""
#Wrap the file in some HTML
#!/bin/sh
echo "<HTML><HEADER><TITLE>FILE</TITLE></HEADER></TITLE>"
echo "Here is the file you requested:<PRE>\n"
cat $PATH_INFO
echo "</PRE></BODY></HTML>"
一個惡意的用戶可能會輸入這樣的 URL:
http://www.hack6.com /cgi-bin/foobar.sh/etc/passed
上述腳本立刻就會返回機器的口令文件。通過這一方法,用戶就可以讀取機器上的幾乎所有文件。
在使用CGI進行Web應用開發時,有一些應該遵循的重要原則。
1.按照幫助文件正確安裝CGI程序,刪除不必要的安全文件和臨時文件。
2.檢查CGI代碼,檢查其來源是否可靠、是否存在漏洞或惡意代碼。
3.使用C/C++ 編寫CGI程序時,注意使用安全的函數。
4.使用安全有效的驗證用戶的方法。
5.驗證用戶的來源,防止用戶短時間內過多動作。
6.建議過濾下列字符:& ; · 、“ | * ? ~ <> ^ () [] {} $ \n \r \t \0 # ../ 。
7.注意處理好意外和錯誤情況。