關(guān)于JSP源碼泄漏問題的總結(jié)分析
JSP編程語言自從推出之日起,由于它的快速、平臺(tái)無關(guān)、可擴(kuò)展、面向?qū)ο蟮忍匦缘玫搅嗽絹碓綇V泛的應(yīng)用,越來越多的廠家開發(fā)出了各種各樣的支持平臺(tái)如IBM 公司的WebSphere、BEA公司的WebLogic等等,也有越來越多的網(wǎng)站開始將自己的平臺(tái)架構(gòu)在JSP 環(huán)境中。
但是隨之而來的就是一系列的安全問題,如JSP源碼泄露、遠(yuǎn)程任意命令執(zhí)行漏洞等等,一些用JSP做的網(wǎng)站,由于存在各種各樣的漏洞,可以被黑客輕松的下載程序的源代碼,對(duì)網(wǎng)站的安全構(gòu)成威脅。
造成JSP源碼泄露的原因
服務(wù)器漏洞是安全問題的起源,黑客對(duì)網(wǎng)站的攻擊也大多是從查找對(duì)方的漏洞開始的。所以只有了解自身的漏洞,網(wǎng)站管理人員才能采取相應(yīng)的對(duì)策,阻止外來的攻擊。
雖然JSP也是一種web編程語言,但是它和其它的web編程語言如PHP、ASP的工作機(jī)制是不一樣的。
首次調(diào)用JSP文件其實(shí)是執(zhí)行一個(gè)編譯為Servlet的過程。試圖下載JSP源代碼的人(比如黑客)往往利用JSP的各種漏洞,讓JSP文件在編譯前被瀏覽器當(dāng)作一個(gè)文本或其它文件發(fā)送給客戶端,或在JSP裝載的時(shí)候不去執(zhí)行編譯好的Servlet而直接讀JSP的內(nèi)容并發(fā)送給客戶端,從而讓源代碼一覽無余。
JSP源代碼泄漏的幾種類型
源代碼暴露類別主要指的是程序源代碼會(huì)以明文的方式返回給訪問者.
我們知道不管是JSP還是ASP、PHP等動(dòng)態(tài)程序都是在服務(wù)器端執(zhí)行的,執(zhí)行后只會(huì)返回給訪問者標(biāo)準(zhǔn)的html 等代碼。這是理論上的東西,實(shí)際運(yùn)行起來由于服務(wù)器內(nèi)部機(jī)制的問題就有可能引起源代碼暴露的漏洞,簡(jiǎn)單的例子是只要在程序文件名后加幾個(gè)簡(jiǎn)單的字符就可能獲得程序代碼,如常見微軟ASP 的global.asa+.htr、XXXX.asp%81等等漏洞。
一、添加特殊后綴引起JSP源碼泄露
在JSP中也存在著和asp這些漏洞類似的問題,如IBM Websphere Application Server 3.0.21、BEA Systems Weblogic 4.5.1、Tomcat一等JSP文件后綴大寫漏洞;JSP 文件后加特殊字符如Resin1.2的%82、../漏洞;ServletExec的%2E、+漏洞、%2E、+、%2B、 、%5C、%20、%00 等。
黑客如果利用該漏洞,將導(dǎo)致泄露指定的JSP文件的源代碼。例一:使用下面的任意一個(gè)URL請(qǐng)求將輸出指定的JSP文件的源代碼:
1)http://target/directory/jsp/file.jsp.
2)http://target/directory/jsp/file.jsp%2E
3)http://target/directory/jsp/file.jsp
4)http://target/directory/jsp/file.jsp%2B
5)http://target/directory/jsp/file.jsp
6)http://target/directory/jsp/file.jsp%5C
7)http://target/directory/jsp/file.jsp%20
等等。
例二,在Tomcat一下,在瀏覽器中本來可以正常解釋執(zhí)行的是http://localhost:8080/inde.jsp,但是如果將inde.jsp改為inde.JSP或者inde.Jsp等等試試看,你會(huì)發(fā)現(xiàn)瀏覽器會(huì)提示你下載這個(gè)文件,下載后源代碼可以看個(gè)一干二凈。
原因是JSP是大小寫敏感的,Tomcat只會(huì)將小寫的JSP后綴的文件當(dāng)作是正常的JSP文件來執(zhí)行,如果大寫了就會(huì)引起Tomcat將inde.JSP當(dāng)作是一個(gè)可以下載的文件讓客戶下載。老版本的WebLogic、WebShpere等都存在這個(gè)問題,現(xiàn)在這些公司或者發(fā)布了新版本或者發(fā)布了補(bǔ)丁解決了這問題。
解決辦法
解決這種由于添加后綴引起的源代碼泄漏有兩種方法,一種方法是在服務(wù)器軟件的網(wǎng)站上下載補(bǔ)丁;另外一種方法是在服務(wù)器設(shè)置中添加一些映射如.JSP 、.Jsp、.jsp%2E等,將他們映射到一個(gè)自己寫的servlet,這個(gè)Servlet的唯一功能就是將請(qǐng)求導(dǎo)向一個(gè)自定義的類似404 not found的出錯(cuò)頁面,不同的服務(wù)器設(shè)置的地方也不同。
如果沒有使用任何靜態(tài)頁面或圖像,可以配置一個(gè)默認(rèn)的 servlet,并將"/"映射到這個(gè)默認(rèn)的 servlet。這樣當(dāng)收到一個(gè)未映射到某個(gè) servlet 的 URL 時(shí),這個(gè)默認(rèn)的servlet 就會(huì)被調(diào)用。在這種情況下,默認(rèn)的 servlet 可以僅僅返回"未找到文件"。如果使用了靜態(tài)的頁面或圖像,仍然可以作這樣的配置,但是需要讓這個(gè)默認(rèn)的servlet 處理對(duì)合法的靜態(tài)頁面和圖像的請(qǐng)求。
另一種可能就是將*.jsp+、*.jsp.和*.jsp等映射到一個(gè) servlet,而該servlet只是返回"未找到文件"。對(duì)于*.jsp%00和*.jsp%20這樣的情況,映射應(yīng)以未經(jīng)編碼的形式輸入。例如,對(duì)于*.jsp%20的映射應(yīng)輸入"*.jsp "。注意%20被轉(zhuǎn)換成一個(gè)空格字符。
二、插入特殊字符串引起JSP源碼泄露
插入特殊字符串引起的漏洞有很多,例如BEA WebLogic Enterprise 5.1中,文件路徑開頭為 "/file/" 的漏洞、IBM WebSphere 3.0.2中"/servlet/file/"文件開頭漏洞等等。
如果在IBM WebSphere 3.0.2中的一個(gè)請(qǐng)求文件的 URL 為"login.jsp":http://site.running.websphere/login.jsp,那么,用戶在訪問http://site.running.websphere/servlet/file/login.jsp 時(shí)將看到這個(gè)文件的源代碼。
原因是由于IBM WebSphere 3.0.2是調(diào)用不同的 servlets 對(duì)不同的頁面進(jìn)行處理,如果一個(gè)請(qǐng)求的文件是未進(jìn)行注冊(cè)管理的,WebSphere 會(huì)使用一個(gè)默認(rèn)的 servlet 調(diào)用。如果文件路徑以"/servlet/file/"作開頭這個(gè)默認(rèn)的 servlet 會(huì)被調(diào)用這個(gè)請(qǐng)求的文件會(huì)未被分析或編譯就顯示出來。
解決方法
在服務(wù)器軟件的網(wǎng)站下載最新的補(bǔ)丁。
三、路徑權(quán)限引起的文件JSP源碼泄露
這種漏洞在正常的JSP漏洞中沒有反映出來,但是我們知道,大部分的JSP應(yīng)用程序在當(dāng)前目錄下都會(huì)有一個(gè)WEB-INF目錄,這個(gè)目錄通常存放的是JavaBeans編譯后的class 文件,如果不給這個(gè)目錄設(shè)置正常的權(quán)限,所有的class就會(huì)曝光。
也許有人認(rèn)為class是經(jīng)過編譯的,就算被下載也沒有什么關(guān)系,但是現(xiàn)在class 反編譯為java代碼的軟件也很多,采用反編譯軟件對(duì)下載的class文件反編譯后,和原始的java文件幾乎一模一樣,連變量名都沒有變,還可以正常使用。
更大的安全問題是,有的軟件開發(fā)人員把數(shù)據(jù)庫的用戶名密碼都寫在了java代碼中,現(xiàn)在一反編譯誰都能看到數(shù)據(jù)庫的重要信息。通過數(shù)據(jù)庫的遠(yuǎn)程連接功能,可以輕松的進(jìn)入到數(shù)據(jù)庫中,所有信息將全部被別人掌握。
解決方法
有一個(gè)方法可以有效地解決由于路徑權(quán)限引起的代碼泄漏問題,就是將ASP程序單獨(dú)放置一個(gè)目錄,設(shè)置該目錄上的用戶權(quán)限只能執(zhí)行不能讀取。在JSP環(huán)境下同樣可以通過設(shè)置服務(wù)器的環(huán)境來解決這個(gè)問題:將一些比較重要的目錄如WEB-INF、classes等設(shè)置上訪問的權(quán)限,不允許讀而取只允許執(zhí)行。以Apache 下解決為例,可以在httpd.conf文件中添加一目錄WEB-INF并設(shè)置Deny from all等屬性。
另一種解決方法就是在每個(gè)重要目錄下添加一個(gè)默認(rèn)起始頁面如index.htm等,這樣讀取目錄就會(huì)返回給訪問者這個(gè)文件而不是其它了。
相比較而言,建議采用第一種方法。
更為重要的是密碼的保存問題,在ASP 開發(fā)中,可以將密碼文件保存在系統(tǒng)目錄如WINNT 下,然后用一個(gè)com來讀取這個(gè)文件,這樣就算看到了ASP源代碼也不知道數(shù)據(jù)庫信息了。在JSP中我們也可以寫一個(gè)property文件,放置在WINNT系統(tǒng)目錄下,然后用Bean來讀取數(shù)據(jù)庫信息,這樣通過源代碼知道了數(shù)據(jù)庫信息存在WINNT中的.property文件里面,但也很難訪問它,這樣就算源代碼被人知道起碼數(shù)據(jù)庫是安全的。
四、文件不存在引起的絕對(duì)路徑JSP源碼泄露
這個(gè)問題現(xiàn)在已經(jīng)出現(xiàn)了很多,因?yàn)槲④汭IS 中也有比較多的類似問題,如微軟IIS5.0中的*.idc暴露絕對(duì)路徑漏洞。同樣的這些問題現(xiàn)在出現(xiàn)在JSP環(huán)境中,這個(gè)漏洞暴露了web程序的絕對(duì)硬盤地址,和其他漏洞結(jié)合就具有比較大的危害了。
例如:在特定的服務(wù)器軟件下,訪問一個(gè)不存在的JSP文件如
原因是由于負(fù)責(zé)JSP 執(zhí)行的相關(guān)Servlet中處理異常的時(shí)候沒有過濾掉這種情況。
解決方法
對(duì)于因?yàn)槲募淮嬖谝鸬慕^對(duì)路徑暴露問題,有兩種解決方法。一種方法是下載最新的補(bǔ)丁。另一種方法是找到服務(wù)器軟件的JSP 執(zhí)行映射Servlet文件(當(dāng)然是class 后綴的),將它用軟件反編譯,在反編譯后的源代碼中找到處理Eception的方法,然后將方法中的處理部分全部注釋掉,并將請(qǐng)求導(dǎo)向到一個(gè)自定義的出錯(cuò)頁面中,這樣問題就解決了。
結(jié)束語
通過上面內(nèi)容我們可以看出,存在著很多安全上的JSP源碼泄露問題的,客觀的說,服務(wù)器軟件的開發(fā)商在內(nèi)部測(cè)試中不可能將系統(tǒng)中的所有BUG找出來,即使發(fā)布了軟件后,被發(fā)現(xiàn)的JSP源碼泄露也只會(huì)是其中的很小一部分,將來還會(huì)不斷的有新的安全問題出現(xiàn),所以我們必須時(shí)刻提高警惕,并注意自己網(wǎng)站的安全。
【編輯推薦】