top
Loading...
jsp安全問題及其解決建議

jsp編程語言自從推出之日起,由于它的快速、平臺無關、可擴展、面向對象等特性得到了越來越廣泛的應用,越來越多的廠家開發出了各種各樣的支持平臺如IBM 公司的WebSphere、BEA公司的WebLogic等等,也有越來越多的網站開始將自己的平臺架構在jsp 環境中。

但是隨之而來的就是一系列的安全漏洞問題,如源代碼暴露漏洞、遠程任意命令執行漏洞等等,更為頭疼的是,隨著jsp 的越來越廣泛的應用,安全問題也越來越多了。截止到這篇文章為止,Internet上公開的關于jsp 的漏洞問題就多達二、三十條(還不包括未公開的)。(統計數據來源于http://www.securityfocus.com)

不要輕視這些問題,想象一下,你辛辛苦苦開發出來的jsp 代碼就被別人這樣輕而易舉的獲得了,更為重要的是,你公司網站的代碼被人下載后,別有用意的人就會看你的代碼,從中找到一些漏洞來攻擊你的公司網站,所以這些問題不容忽視。作者在sohu 上搜索了一些用jsp做的國內網站,結果發現有一些網站確實存在各種各樣的漏洞,可以輕松的下載jsp源代碼。

本篇文章重點在于對jsp安全問題進行分類闡述和提出解決的建議,所以每種類型的安全問題只采用了一個例子,對于其它各種漏洞的具體細節如涉及到何種軟件版本何種操作系統等就不一一進行闡述了,有興趣的讀者可以到我的網站jsp 愛好者(http://jspbbs.yeah.net)或者國外的安全站點(http://www.securityfocus.com)進行查看和參考。

根據目前已經發現的jsp安全問題,我們不妨將它們分為以下幾類,源代碼暴露類、遠程程序執行類和其他類別,下面來看看具體的東西吧。

一、源代碼暴露類

源代碼暴露類別主要指的是程序源代碼會以明文的方式返回給訪問者.

我們知道不管是jsp還是asp、php等動態程序都是在服務器端執行的,執行后只會返回給訪問者標準的html 等代碼。這是理論上的東西,實際運行起來由于服務器內部機制的問題就有可能引起源代碼暴露的漏洞,簡單的例子只要在程序文件名后加幾個簡單的字符就可能獲得程序代碼,如常見微軟asp 的global.asa+.htr、XXXX.asp%81等等漏洞。

1、添加特殊后綴引起jsp源代碼暴露

在jsp中也存在著和asp這些漏洞類似的問題,如IBM Websphere Application Server 3.0.21、BEA Systems Weblogic 4.5.1、Tomcat3.1等jsp文件后綴大寫漏洞;jsp 文件后加特殊字符如Resin1.2的%82、http://www.zhujiangroad.com/漏洞;ServletExec的%2E、+漏洞等等。

例子:舉個老一點的JSP大寫例子,Tomcat3.1下在瀏覽器中本來是http://localhost:8080/inde.jsp,可以正常解釋執行,但是如果將inde.jsp改為inde.JSP或者inde.Jsp等等試試看,你會發現瀏覽器會提示你下載這個文件,下載后源代碼可以看個一干二凈。

原因:jsp是大小寫敏感的,Tomcat只會將小寫的jsp后綴的文件當作是正常的jsp文件來執行,如果大寫了就會引起Tomcat將inde.JSP當作是一個可以下載的文件讓客戶下載。老版本的WebLogic、WebShpere等都存在這個問題,現在這些公司或者發布了新版本或者發布了補丁解決了這問題。

解決辦法:一是在服務器軟件的網站上下載補丁;因為筆者以前用過asp 一段時間,接觸了很多IIS的漏洞,它的有效解決方法是去掉不必要的映射如htr、htx等,在jsp 中我們同樣可以參考IIS的解決方法,不同的是不是去掉而是添加映射,方法為在服務器設置中添加一些映射如.JSP 、.Jsp、.jsp%2E等,將他們映射到一個自己寫的servlet,這個Servlet的唯一功能就是將請求導向一個自定義的類似404 not found的出錯頁面,不同的服務器設置的地方也不同,請參考相應的文檔。第二種解決方法可以在沒有補丁的時候采用。

2、插入特殊字符串引起jsp源代碼暴露

還有一種是插入特殊字符串引起的漏洞,BEA WebLogic Enterprise 5.1.
文件路徑開頭為 "/file/" 的漏洞、IBM WebSphere 3.0.2的"/servlet/file/"文件開頭漏洞等等。

例子:如IBM WebSphere 3.0.2中,如果一個請求文件的 URL 為"login.jsp":http://site.running.websphere/login.jsp,那么訪問http://site.running.websphere/servlet/file/login.jsp將看到這個文件的源代碼。

原因:因為IBM WebSphere 3.0.2是調用不同的 servlets 對不同的頁面進行處理,如果一個請求的文件是未進行注冊管理的,WebSphere 會使用一個默認的 servlet 調用。如果文件路徑以"/servlet/file/"作開頭這個默認的 servlet 會被調用這個請求的文件會未被分析或編譯就顯示出來。

解決方法:在服務器軟件的網站下載最新的補丁。

3、路徑權限引起的文件jsp源代碼暴露

這種漏洞在正常的jsp漏洞中沒有反映出來,但是筆者在寫jsp程序中曾經碰到過,頭疼了一陣子,最后總算解決了。我們知道,大部分的jsp應用程序在當前目錄下都會有一個WEB-INF目錄,這個目錄通常存放的是JavaBeans編譯后的class 文件,如果不給這個目錄設置正常的權限,所有的class就會曝光。

例子:筆者當時采用的是Apache1.3.12加上第三方jsp軟件形式的WEB服務器,因為Apache1.3.12默認的設置是可以讀取目錄的,如果程序在http://site.running.websphere/login.jsp,只要修改一下http://site.running.websphere/WEB-INF/所有這個目錄下以及這個目錄下的子目錄中的class文件可以看個一干二凈的,還可以下載到本機上。

也許你會說class是經過編譯的,就算被人下載也沒有什么關系,但是現在class 反編譯為java代碼的軟件也很多,筆者當時采用JAD軟件對下載的class文件反編譯了一下,居然和原始的java文件幾乎一模一樣,變量名都沒有變,更驚奇的是還可以重新編譯為class文件正常使用。

安全問題更大的就是,筆者開始把數據庫的用戶名密碼都寫在了java代碼中,現在一反編譯誰都能看到數據庫的重要信息。通過數據庫的遠程連接功能,可以輕松的進入到你的數據庫中,所有信息全部在他手中。附帶說一句,如果用戶能獲得SQL Server的用戶名口令(sa 的),進入數據庫中可以執行任意的dos命令如查看c:文件、建立和刪除目錄等,那樣整個Windows系統都不安全了(此種方法危害性更大,恕作者不公布出來)。

作者曾經偶然在網上看到過國內某個大型網站有同樣的問題,而且密碼也是和筆者一樣寫在JavaBean中的,極不安全。

解決方法:IIS以前一個有效地解決asp的漏洞就是將asp程序單獨放置一個目錄,目錄設置上用戶權限只能執行不能讀取。在jsp環境下同樣可以通過設置服務器的環境來解決這個問題,簡單的說就是將一些比較重要的目錄如WEB-INF、classes等設置上訪問的權限,不允許讀而取只允許執行。以apache 下解決為例,可以在httpd.conf文件中添加一目錄WEB-INF并設置Deny from all等屬性。

另一種比較笨的解決方法就是在每個重要目錄下添加一個默認起始頁面如inde.htm等,這樣讀取目錄就會返回給訪問者這個文件而不是其它了。建議采用的一種方法。

更為重要的是密碼的保存問題,筆者以前在asp 開發中是采用密碼文件保存在系統目錄如WINNT 下的,然后寫了一個com來讀取這個文件,這樣就算看到了asp源代碼也不知道數據庫信息了。在jsp中我們也可以寫一個property文件,放置在WINNT系統目錄下,然后用Bean來讀取數據庫信息,這樣通過源代碼知道了數據庫信息存在WINNT中的.property文件里面,但也很難訪問它,這樣就算源代碼被人知道起碼數據庫是安全的。

4、文件不存在引起的絕對路徑暴露問題

這個問題相信大家都比較熟悉了,因為微軟IIS 中也有比較多的類似問題如微軟IIS5.0中的*.idc暴露絕對路徑漏洞。同樣的這些問題現在也轉到了jsp環境中,這個漏洞暴露了web程序的絕對硬盤地址,和其他漏洞結合就具有比較大的危害了,因為這個漏洞目前還沒有在國外安全網站上看到,而站長也沒有一一測試過所有的jsp服務器程序,所以沒有辦法告訴大家那些有這個漏洞了,大家可以在自己的web服務器上測試看看。

例子:在特定的服務器軟件下,訪問一個不存在的jsp文件如 http://localhost:8080/fdasfas.jsp,就會返回java.servlet.ServletEception: java.io.FileNotFoundEception: c:webappfadssad.jsp (???????????)這樣的錯誤,這樣就可以知道你網站在c:webapp目錄下,也許一般人不太在意,但是對于一個黑客來說就是很有幫助了。

原因:負責jsp 執行的相關Servlet中處理異常的時候沒有過濾掉這種情況。

解決方法:一是下載最新的補丁;由于筆者當時的web 服務器軟件沒有這個補丁,經過一段時間的痛苦煎熬后,總算找到了另外一種方法,就是找到服務器軟件的jsp 執行映射Servlet文件(當然是class 后綴的),將它用JAD軟件反編譯,在反編譯后的源代碼中找到處理Eception的方法,然后將方法中的處理部分全部注釋掉,并將請求導向到一個自定義的出錯頁面中,這樣問題就解決了。

二、遠程程序執行類

這類漏洞的特點就是可以通過url 地址在瀏覽器中執行任意服務器上的命令和程序,從而引起安全問題。如Allaire JRUN 2.3 遠程執行任意命令漏洞、iPlanet Web Server 4.x存在一個緩沖區溢出漏洞等等。

例子:Allaire 的 JRUN 服務器 2.3上輸入下面的url地址http://jrun:8000/servlet/jsp/http://www.zhujiangroad.com/http://www.zhujiangroad.com/path/sample.txt,可以訪問到WEB目錄以外的文件,如果是exe文件,還有可能會引起執行。

原因:如果URL請求的目標文件使用了前綴"/servlet/",則JSP 解釋執行功能被激活。這時在用戶請求的目標文件路徑中使用"http://www.zhujiangroad.com/",就有可能訪問到 WEB 服務器上根目錄以外的文件。目標主機上利用該漏洞請求用戶輸入產生的一個文件,將嚴重威脅到目標主機系統的安全。

解決方法:安裝最新的補丁。

三、其他類別

這些類別的范圍就有點大了,可以包括數據庫如SQL Server、Oracle 、DB2等的漏洞,也可以包括操作系統如WindowsNT/2000、Linu等的漏洞。這些東西的漏洞可以說都是致命的,如利用Linu的某些漏洞可以輕易的Su為管理員來遠程控制服務器,獲得系統的完全控制權限,這樣要獲得jsp源代碼或者摧毀服務器比踩死一只螞蟻還要輕松的多。

四、全文總結

通過上面內容我們可以看出jsp同asp一樣還是存在著很多安全上的問題的,客觀的說,服務器軟件的開發商在內部測試中不可能將系統中的所有bug 找出來,即使發布了軟件后,被發現的漏洞也只會是其中的很小一部分,將來還會不斷的有新的安全問題出現,所以我們必須時刻提高警惕,并注意自己網站的安全。

一個好的建議就是多看安全文章,這些安全文章一般都會有詳細的信息如軟件的版本號、漏洞原因等等,最重要的是還附帶了解決辦法或者是補丁的下載鏈接,推薦的安全站點是國內的安全站點www.cnns.net或者國外的www.securityfocus.com站點;另外一個好的建議就是多裝補丁程序,訪問自己所使用的軟件公司主頁,從那上面獲得最新的補丁程序,做得比較好的就是微軟的站點,安全公告和補丁都特別及時。

最后想用一句話作為全文的結尾:一個優秀的黑客不一定是個好的jsp 程序員,一個優秀的jsp程序員一定要是個好的準黑客。


作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗