您好,歡迎來(lái)電子發(fā)燒友網(wǎng)! ,新用戶(hù)?[免費(fèi)注冊(cè)]

您的位置:電子發(fā)燒友網(wǎng)>電子百科>語(yǔ)音視頻>安防監(jiān)控>

CGI安全問(wèn)題專(zhuān)題

2010年01月14日 09:54 srfitnesspt.com 作者:佚名 用戶(hù)評(píng)論(0
關(guān)鍵字:CGI安全問(wèn)題(7692)

CGI安全問(wèn)題專(zhuān)題

在 計(jì)算機(jī) 領(lǐng)域——尤其在Internet上——盡管大部分Web 服務(wù) 器所編的程序都盡可能保護(hù)自己的內(nèi)容不受侵害,但只要CGI腳本中有一點(diǎn)安全方面的失誤--口令文件、私有數(shù)據(jù)、以及任何東西,就能使 入侵 者能訪問(wèn) 計(jì)算機(jī) 。遵循一些簡(jiǎn)單的規(guī)則并保持警惕能使自己的CGI腳本免受侵害,從而可以保護(hù)自己的權(quán)益。 1. 腳本和程序 在開(kāi)始決定采用何種語(yǔ)言編寫(xiě)CGI腳本時(shí)應(yīng)考慮幾個(gè)因素,其中之一應(yīng)是安全性。Shell 腳本,Perl程序和C可執(zhí)行程序是CGI腳本最常采用的形式,從安全性角度來(lái)說(shuō)每種都備有優(yōu)缺。盡管沒(méi)有哪一種是最好的--基于其他方面的考慮,如速度和可重用性--每種都有實(shí)用的領(lǐng)域。 Shell腳本一般用于小的、快速的甚至可以用完就不要的CGI程序,因此,編寫(xiě)它們時(shí)常常不考慮安全性。這種疏忽可以導(dǎo)致一些缺陷,使得僅對(duì)系統(tǒng)具有一般 知識(shí) 的人也能進(jìn)入系統(tǒng)任意走動(dòng)。 盡管Shell CGI 程序最容易寫(xiě),甚至只需拼湊一下即可,但控制它們卻很困難,因?yàn)樗鼈円话闶峭ㄟ^(guò)執(zhí)行外部的其他程序來(lái)完成工作的。這就導(dǎo)致一些可能的隱患,CGI 程序會(huì)繼承任何它使用的程序的安全問(wèn)題。 例如,常用UNIX實(shí)用程序 awk對(duì)于它能處理的數(shù)據(jù)的數(shù)量有一些相當(dāng)嚴(yán)格限制。如果在CGI腳本中使用awk,那么該程序也就有了同樣的限制。Perl比Shell腳本更進(jìn)一步。Perl用于CGI 編程 有很多優(yōu)點(diǎn),并且相當(dāng)安全。但Perl能給CGI 作者提供足夠的靈活性從而導(dǎo)致對(duì)安全性的錯(cuò)誤感覺(jué)。例如,Perl是解釋型的。這意味著它實(shí)際在調(diào)用時(shí)是先編譯,然后每次執(zhí)行一步。這就很容易使得不正確的用戶(hù)數(shù)據(jù)被包括進(jìn)來(lái)作為 代碼 的一部分,從而錯(cuò)誤地進(jìn)行解釋?zhuān)纬沙绦蛑兄乖颉?最后談?wù)凜。C迅速成為標(biāo)準(zhǔn)應(yīng)用開(kāi)發(fā)語(yǔ)言,幾乎所有的UNIX和windows NT系統(tǒng)都是用它開(kāi)發(fā)的。從安全性的角度來(lái)看C 似乎是很不錯(cuò),但由于它的流行性,它的好幾種安全性問(wèn)題已廣為人知,而這些問(wèn)題也能很容易地被人利用。 例如,C 對(duì)串處理非常差。它不做任何自動(dòng)的定位或清理而讓 編程 者自己處理所有事情。在處理串時(shí),大部分C 程序員都是簡(jiǎn)單地建立一個(gè)預(yù)定義的空間并希望它足夠大以便處理用戶(hù)輸入的任何內(nèi)容。 當(dāng)然,Shell腳本、Perl和C 不是僅有的編寫(xiě)CGI腳本語(yǔ)言。實(shí)際上,任何可以按預(yù)定義的方式與Web 服務(wù) 器進(jìn)行交互的 計(jì)算機(jī) 語(yǔ)言都可以用于編寫(xiě)CGI程序。在UNIX和Windows NT 服務(wù) 器上,數(shù)據(jù)是通過(guò)環(huán)境變量和標(biāo)準(zhǔn)輸入(stdin) 傳給腳本的,所以任何能從這兩種數(shù)據(jù)源讀取并寫(xiě)入標(biāo)準(zhǔn)輸出(sidout)的語(yǔ)言都能用于創(chuàng)建CGI:awk、FORTRAN、C++、Basic和COBOL,等。windows的程序員可以使用流行的Visual Basic,這意味著有經(jīng)驗(yàn)的VB程序員不必去學(xué)一門(mén)新語(yǔ)言。Macintosh使用AppleEvents、和AppleScript與CGI程序進(jìn)行通信,所以任何可以讀寫(xiě)這兩者的語(yǔ)言都可使用。 不過(guò),Shell腳本(不管使用那種Shell)、Perl和C仍是最流行為的編寫(xiě)CGI腳本的語(yǔ)言。這并不是說(shuō)必須使用它們了只是說(shuō)大部程序的庫(kù)——即大部分經(jīng)過(guò)測(cè)試的安全的庫(kù)——都是用這三種語(yǔ)言編寫(xiě)的。如果自己來(lái)選擇CGI 編程 語(yǔ)言,最好是借鑒前人的經(jīng)驗(yàn)。 2. 誰(shuí)也不信 幾乎所有的CGI 安全問(wèn)題都來(lái)自與用戶(hù)的交互。接收來(lái)自外部數(shù)據(jù)源的輸入之后一個(gè)簡(jiǎn)單的、可預(yù)見(jiàn)的CGI程序突然向多方向伸展,每個(gè)方面都可能有最小的縫隙使得“黑客”可以溜進(jìn)來(lái)。正是與用戶(hù)的這種交互——通過(guò)表單或文件路徑——才給予了CGI 腳本這種能力,但同時(shí)也使得它們成了運(yùn)行在Web 服務(wù) 器上的最潛在的危險(xiǎn)部分。 編寫(xiě)安全的CGI 腳本很大程度上是創(chuàng)造性和妄想的結(jié)合。編寫(xiě)者必須有足夠的創(chuàng)造性才能想到用戶(hù)使用的,不管是無(wú)意地還是別的所有的可能隱含導(dǎo)致問(wèn)題的發(fā)送數(shù)據(jù)的方式。而且必須有點(diǎn)妄想,因?yàn)橛锌赡懿恢朗裁磿r(shí)候、什么地方、他們將會(huì)一一加以試驗(yàn)。 2.1 兩種導(dǎo)致問(wèn)題的方式 當(dāng)用戶(hù)登錄進(jìn)入Web 站點(diǎn)并開(kāi)始進(jìn)行交互訪問(wèn)時(shí),他們能以?xún)煞N方式惹麻煩。一種是不遵守規(guī)則,歪曲或違反頁(yè)面中建立的每個(gè)限制或約束;另一種方式是按要求去做。 大部分CGI 腳本是作為HTML表單的后臺(tái)運(yùn)行的,負(fù)責(zé)處理由用戶(hù)輸入的信息并提供某種定制的輸出。因?yàn)樵谶@種情況下,大部分CGI 腳本編寫(xiě)時(shí)都等待某種特殊格式的數(shù)據(jù)。它們期望用戶(hù)的輸入能匹配收集并發(fā)送信息的表單。不過(guò)事情并不總是這樣。用戶(hù)可以有許多種辦法繞過(guò)這些預(yù)定義的格式而給腳本發(fā)送一些看起來(lái)是隨機(jī)的數(shù)據(jù)。CGI 程序必須對(duì)此有所準(zhǔn)備。 其次,用戶(hù)可以給CGI 腳本發(fā)送所期望的數(shù)據(jù)類(lèi)型,按預(yù)期的形式在表單中填入每個(gè)字段。這種類(lèi)型的提交可以是想像中的來(lái)自某個(gè)與站點(diǎn)交互的無(wú)意的用戶(hù),也可能來(lái)自某個(gè)惡意的“黑客”,憑借他有關(guān)操作系統(tǒng)和Web 服務(wù) 器 軟件 的 知識(shí) 并利用常見(jiàn)的 編程 錯(cuò)誤。這些 入侵 ,表面上一切都正常,卻是最危險(xiǎn)的、最難檢測(cè)出來(lái)。Web 站點(diǎn)安全性依賴(lài)干這種 入侵 的防止。 2.2 不要相信表單數(shù)據(jù) 在CGI 編程 中最常見(jiàn)的安全失誤就是相信從表單傳到腳本的數(shù)據(jù),用戶(hù)是未知的一大堆人,他們總能找到一些 編程 人員從來(lái)沒(méi)想到過(guò)的發(fā)送數(shù)據(jù)的方法--而且是程序員認(rèn)為幾乎不可能的方法。 腳本必須對(duì)這些加以考慮。例如,下面這些情形都是可能的: 1)從一組單單選按鈕中選擇的結(jié)果可能不是表單中提供的選項(xiàng)之一。 2)來(lái)自某個(gè)文本字段的數(shù)據(jù)長(zhǎng)度可能大于MAXLENGTH字段允許的長(zhǎng)度。 3)字段本身的名字可能與表單中指定的不相符。 2.3 不合理數(shù)據(jù)的來(lái)源 因—些無(wú)意的或是有意的原因,導(dǎo)致自己的腳本接收到不知道如何去處理的數(shù)據(jù),有可能導(dǎo)致非預(yù)期的——同時(shí)很危險(xiǎn)的——行為。 下面的 代碼 實(shí)現(xiàn)了一種表單并向某個(gè)搜索yahoo! 數(shù)據(jù)庫(kù) 的CGI腳本送垃圾。該腳本設(shè)計(jì)得很好并且很安全,因?yàn)樗雎粤瞬徽J(rèn)識(shí)的輸入。

Enter your name,first then last: $input _ Max) { return(0,input too big); } #Read the input from QUERY _ STRING return(1,$ENV{\\\QUERY _ TRING\\\}); } elsif ($input _ Method eq POST) { #POST local($input _ Size)=$ENV{\\\CONTENT _ LENGTH\\\}; local($input _ Data); #Check the size of the input if ($input _ Size>$input _ Max) { return(0,Input too big); } #Read the input from stdin unless (read(STDIN,$input _ Data,$input _ Size)) { return(0,Could not read STDIN); } return(1,$Input _ Data); } #Unrecognized METHOD return (0,METHOD not GET POST); } 總而言之,腳本應(yīng)該不對(duì)接收的表單數(shù)據(jù)進(jìn)行假設(shè),應(yīng)盡可能預(yù)計(jì)意料之外的情形并正確地處理不正確的或錯(cuò)誤的輸入數(shù)據(jù)。在使用數(shù)據(jù)之前應(yīng)按盡可能多的方式測(cè)試它拒絕不合理的輸入并打印一條錯(cuò)誤消息如果某項(xiàng)出錯(cuò)或漏了應(yīng)自動(dòng)選擇一個(gè)缺省值甚至可以試圖對(duì)輸入進(jìn)行編碼以成為程序的合理的輸入。選擇哪種方式依賴(lài)于自己想花費(fèi)多少時(shí)間和精力,不過(guò)記住永遠(yuǎn)也不要盲目接收傳給CGI腳來(lái)的所有信息。 2.5不要相信路徑數(shù)據(jù) 用戶(hù)能修改的另一類(lèi)型數(shù)據(jù)是PATH _ INTO的 服務(wù) 器環(huán)境變量。該變量由CGI URL中緊跟在腳本文件名之后的任何路徑信息填充的。例如,如果foobar.sh是一個(gè)CGl shell腳本,那么當(dāng)foobar.sh運(yùn)行時(shí),URL http://www.server.com/cgi-bin/foobar.sh/extra/path/info 將導(dǎo)致/extra/path/info被放進(jìn)PATH _ INFO環(huán)境變量中。 如果使用這個(gè)PATH _ INFO環(huán)境變量,就必須小心地完全驗(yàn)證它的內(nèi)容。就像表單數(shù)據(jù)能以許多種方式被修改一樣,PATH _ INFO也可以修改。盲目地根據(jù)PATH _ INFO的中指定的路徑文件進(jìn)行操作的CGI腳本可能會(huì)讓惡意的用戶(hù)對(duì) 服務(wù) 器造成傷害。 例如,如果某個(gè)CGI腳來(lái)設(shè)計(jì)用于簡(jiǎn)單地打印出PATH _ INFO中引用的文件,那么編輯該CGI URL的用戶(hù)就可以讀取機(jī)器上的幾乎所有文件,如下所示: #!/bin/sh #Send the header echo Conext-type:text/html echo #Wrap the file in some HTML #!/bin/sh echo
File
echoHere is the file you requested:
\\n cat $PATH _ INFO echo 
盡管在用戶(hù)只單擊預(yù)定義的鏈接(即 http://www.server.com/cgi-bin/foobar.sh/public/faq.txt )時(shí),該腳本正常工作,但是一個(gè)更有創(chuàng)造性的(或惡意的)用戶(hù)可能會(huì)利用它接收 服務(wù) 器上的任何文件。如果他想進(jìn)入 http://www.server.com/cgi-bin/foobar.sh/etc/passwd ,前面的腳本會(huì)很高興地返回機(jī)器的口令文件——這可是不希望發(fā)生的事。 另一種安全得多的方式是在可能時(shí)使用PATH _ TRANSLATED環(huán)境變量。不是所有的 服務(wù) 器都支持該變量,所以腳本不能依賴(lài)于它。不過(guò)如果有的話,它能提供完全修飾的路徑名,而不是像PATH _ INFO提供的相對(duì)URL。 不過(guò)在某種情形下,如果在CGI腳本中使用PATH _ TRANSLATED的話,則可以訪問(wèn)通過(guò)瀏覽器不能訪問(wèn)到的文件。應(yīng)該知道這點(diǎn)及它的應(yīng)用。 在大部分UNIX 服務(wù) 器上,htaccess文件可以位于文檔樹(shù)的每個(gè)子目錄,負(fù)責(zé)控制誰(shuí)能夠訪問(wèn)該目錄中的特殊文件。例如它可以用于限制一組Web頁(yè)面只給公司雇員看。 雖然 服務(wù) 器知道如何解釋.htaccess,從而知道如何限制誰(shuí)能還是不能看這些頁(yè)面,CGI腳本卻不知道。使用PATH _ TRANSLATED訪問(wèn)文件樹(shù)中任意文件的程序有可能碰巧覆蓋了 服務(wù) 器提供的保護(hù)。 無(wú)論使用PATH _ INFO還是PATH _ TRANSLATED,另一個(gè)重要的步驟是驗(yàn)證路徑以確保它或者是一個(gè)真正的相對(duì)路徑或者是腳本認(rèn)可的幾個(gè)準(zhǔn)確的、預(yù)知的路徑之一。對(duì)于預(yù)定的路徑,腳本將簡(jiǎn)單地將提供的數(shù)據(jù)與認(rèn)可可以使用的文件的內(nèi)部清單進(jìn)行比較,這就是說(shuō)在增加文件或修改路徑時(shí)必須重新編譯腳本,但安全性卻有了保障。只允計(jì)用戶(hù)選擇幾個(gè)預(yù)定義的文件而不允許用戶(hù)指定實(shí)際的路徑和文件名。 下面是處理訪問(wèn)者提供的路徑時(shí)應(yīng)遵循的一些規(guī)則。 1)相對(duì)路徑不以斜線開(kāi)頭。斜線意味著相對(duì)于根或絕對(duì)路徑。如果有的話,CGI腳本也是很少需要訪問(wèn)Web根之外的數(shù)據(jù)。這樣它們使用的路徑就是相對(duì)于Web根目錄,而不是絕對(duì)路徑。應(yīng)拒絕任何以斜線開(kāi)始的內(nèi)容。 2)在路徑中單個(gè)點(diǎn)(.)和兩個(gè)點(diǎn)(..)的序列也有特殊含義。單點(diǎn)意味著對(duì)對(duì)于當(dāng)前目錄,而雙點(diǎn)意味著相對(duì)于當(dāng)前目錄的父目錄。聰明的黑客可以建立象../../../etc/passwd這樣的串逆向三層,然后向下進(jìn)入/etc/passwd文件。應(yīng)拒絕任何包含雙點(diǎn)序列的內(nèi)容。 3)基于NT 服務(wù) 器使用驅(qū)動(dòng)器字母的概念來(lái)引用磁盤(pán)卷。包含對(duì)驅(qū)動(dòng)器的引用的路徑都以一個(gè)字母加上一個(gè)冒號(hào)開(kāi)頭。應(yīng)拒絕任何以冒號(hào)為第二個(gè)字符的內(nèi)容。 4)基于NT的 服務(wù) 器還支持Univesal Naming Conventions(UNC)引用。一個(gè)UNC文件規(guī)格指定機(jī)器名和一個(gè)共享點(diǎn),其余部分與指定機(jī)器上的指定的共享點(diǎn)有關(guān)。UNC文件規(guī)格總是以?xún)蓚€(gè)反斜線開(kāi)頭。應(yīng)拒絕任何UNC路徑。

非常好我支持^.^

(0) 0%

不好我反對(duì)

(0) 0%

相關(guān)閱讀:

( 發(fā)表人:admin )

      發(fā)表評(píng)論

      用戶(hù)評(píng)論
      評(píng)價(jià):好評(píng)中評(píng)差評(píng)

      發(fā)表評(píng)論,獲取積分! 請(qǐng)遵守相關(guān)規(guī)定!

      ?