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