js|安全|安全性
綜述:有幾種辦法可以暴露JSP代碼,不過經過大量測試,這和WEB SERVER的配置有絕對的關係,就拿IBM Websphere Commerce Suite而言,還有別的方法看到JSP原始碼,但相信是IBM HTTP SERVER的配置造成的。
如果想發現JSP暴露原始碼的BUG的話,首先需要瞭解JSP的工作原理。
JSP和其它的PHP、ASP工作機制不一樣,雖然它也是一種web程式設計語言。首次調用JSP檔案其實是執行一個編譯為Servlet的過程。注意我們就要在這上邊做文章,明白嗎?我們要乾的事情是,讓JSP在編譯前被瀏覽器當作一個文本或其它檔案發送給用戶端,或在JSP裝載的時候不去執行編譯好的Servlet而直接讀JSP的內容並發送給用戶端。
明白了道理及所要達到的目的就好下手了,仔細觀察調用及返回過程可以發現:JSP被編譯為了Servlet儲存在指定的目錄下,如:http://www.x.com/lovehacker/index.jsp很可能存放在X:\IBM\WAServer\temp\default_host\default_app\pagecompile\_lovehacker_index_xjsp.class,這是已經編譯過的index.jsp。_lovehacker_index_xjsp.class顯然是我們不需要的檔案,而且我們得到它的可能性也不大,我們要乾的是不去執行_lovehacker_index_xjsp.class而是直接讀index.jsp的內容。
據分析最初的xxx.JSP暴露原始碼也是因為前邊的這種想法造成的,本來目錄中存放了一個_xxx_xjsp.class,但訪問xxx.JSP本來是個合法的請求,而又找不到對應的Servlet所以就把xxx.JSP當做一個文本或其它檔案發送給了使用者。
也許這是因為IBM HTTP SERVER配置不當造成的,但相信如果能成功的話,會有一種成就感,很爽的哦!
順便說一下暴露檔案存放真實路徑可能會帶來的危害:
1.先會讓入侵者瞭解磁碟配置情況
2.明的入侵者甚至可以分析出管理員的水平高低
3.為入侵者修改你的首頁提供了方便(起碼不用在找你的WEB目錄在那個磁碟了)
4.可能被利用一些其它的CGI的漏洞尋找到Web目錄下的檔案如XX.ASP、XX.JSP、XX.PHP等
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、../漏洞;ServletExec的%2E、+漏洞等等。
例子:舉個老一點的JSP大寫例子,Tomcat3.1下在瀏覽器中本來是http://localhost:8080/inde.jsp,可以正常解釋執行,但是如果將inde.jsp改為inde.JSP或者inde.Jsp等等試試看,你會發現瀏覽器會提示你下載這個檔案,下載後原始碼可以看個一乾二淨。
原因:jsp是大小寫敏感的,Tomcat只會將小寫jsp尾碼的檔案當作是正常的jsp檔案來執行,如果大寫了就會引起Tomcat將index.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應用程式在目前的目錄下都會有一個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的使用者名稱口令,進入資料庫中可以執行任意的dos命令如查看c:\檔案、建立和刪除目錄等,那樣整個Windows系統都不安全了。
解決方案:IIS以前一個有效地解決asp漏洞的方法,就是將asp程式單獨放置一個目錄,目錄設定上使用者權限只能執行不能讀取。在jsp環境下同樣可以通過設定伺服器的環境來解決這個問題,簡單的說,就是將一些比較重要的目錄如WEB-INF、classes等設定上訪問的許可權,不允許讀而取只允許執行。以apache 下解決為例,可以在httpd.conf檔案中添加一目錄WEB-INF並設定Deny from all等屬性。
另一種比較笨的解決方案就是在每個重要目錄下添加一個預設起始頁面如index.htm等,這樣讀取目錄就會返回給訪問者這個檔案而不是其它了。建議採用的一種方法。
更為重要的是密碼的儲存問題。在jsp中可以寫一個property檔案,放置在WINNT系統目錄下,然後用Bean來讀取資料庫資訊,這樣通過原始碼知道了資料庫資訊存在WINNT中的.property檔案裡面,但也很難訪問它,這樣就算原始碼被人知道起碼資料庫是安全的。
4.檔案不存在引起的絕對路徑暴露問題
這個問題相信大家都比較熟悉了,因為微軟IIS 中也有比較多的類似問題。如微軟IIS5.0中的*.idc暴露絕對路徑漏洞。同樣的這些問題現在也轉到了jsp環境中,這個漏洞暴露了web程式的絕對硬碟地址,和其他漏洞結合就具有比較大的危害了
例子:在特定的伺服器軟體下,訪問一個不存在的jsp檔案如 http://localhost:8080/fdasfas.jsp,就會返回Java.servlet.ServletEception: Java.io.FileNotFoundEception: c:\web\app\fadssad.jsp (???????????)這樣的錯誤,這樣就可以知道網站在c:\web\app目錄下,也許一般人不太在意,但是對於一個駭客來說就是很有協助了。
原因:負責jsp 執行的相關Servlet中處理異常的時候沒有過濾掉這種情況。
解決方案:一是下載最新的補丁;如果當時的網頁伺服器軟體沒有這個補丁,可以找到伺服器軟體的jsp 執行映射Servlet檔案(當然是class 尾碼的),將它用JAD軟體反編譯,在反編譯後的原始碼中找到處理Exception的方法,然後將方法中的處理部分全部注釋掉,並將請求導向到一個自訂的出錯頁面中,這樣問題就解決了。
二、遠程程式執行類
這類漏洞的特點就是可以通過url 地址在瀏覽器中執行任意伺服器上的命令和程式,從而引起安全問題。如Allaire JRUN 2.3 遠程執行任意命令漏洞、iPlanet Web Server 4.x存在一個緩衝區溢位漏洞等等。
例子:Allaire 的 JRUN 伺服器 2.3上輸入下面的url地址http://jrun:8000/servlet/jsp/../../path/sample.txt,可以訪問到WEB目錄以外的檔案,如果是exe檔案,還有可能會引起執行。
原因:如果URL請求的目標檔案使用了首碼"/servlet/",則JSP 解釋執行功能被啟用。這時在使用者請求的目標檔案路徑中使用"../",就有可能訪問到 WEB 伺服器上根目錄以外的檔案。目標主機上利用該漏洞請求使用者輸入產生的一個檔案,將嚴重威脅到目標主機系統的安全。
解決方案:安裝最新的補丁。
三、其他類別
這些類別的範圍就有點大了,可以包括資料庫如SQL Server、Oracle 、DB2等的漏洞,也可以包括作業系統如WindowsNT/2000、Linu等的漏洞。這些東西的漏洞可以說都是致命的,如利用Linux的某些漏洞可以輕易獲得管理員權限來遠端控制伺服器,獲得系統的完全控制許可權,這樣要獲得jsp原始碼或者摧毀伺服器比踩死一隻螞蟻還要輕鬆的多。
四、全文總結
通過上面內容可以看出jsp同asp一樣還是存在著很多安全上的問題的,客觀的說,伺服器軟體的開發商在自我裝載中不可能將系統中的所有bug 找出來,即使發布了軟體後,被發現的漏洞也只會是其中的很小一部分,將來還會不斷的有新的安全問題出現,所以我們必須時刻提高警惕,並注意自己網站的安全。
一個好的建議就是多看安全文章,這些安全文章一般都會有詳細的資訊如軟體的版本號碼、漏洞原因等等,最重要的是還附帶瞭解決辦法或者是補丁的下載連結,推薦的安全網站是國內的安全網站www.cnns.net或者國外的http://www.securityfocus.com網站;另外一個好的建議就是多裝補丁程式,訪問自己所使用的軟體公司首頁,從那上面獲得最新的補丁程式,做得比較好的就是微軟的網站,資訊安全諮詢和補丁都特別及時。
最後想用一句話作為全文的結尾:一個優秀的駭客不一定是個好的jsp 程式員,一個優秀的jsp程式員一定要是個好的准駭客。
哪些方式可實現Java Servlet及JSP的應用安全?
一個web 應用程式可擁有多種資源,經常有許多敏感的資訊在沒有保護措施的情況下在開放性網路上傳輸。在這種環境下,實際上許多web 應用程式有一定程度的安全性要求。大多數的servlet 容器有明確的機制和結構來達到這種安全要求。雖然保證和執行的細節可能有些不同,但是,都具有下面的特點:
1.Authentication:通訊實體相互驗證對方的行為是以一個明確的身份在進行的一種機制。
2.Access control for resources:對某組使用者來說,對資料庫的某些操作是受到限制的,或對有些程式強調可用性,完整性或保密性的一種機制。
3.Data Integrity:資料在傳遞過程中保證不被第三方修改的一種機制。
4.Confidentiality or Data Privacy:保證資料只被那些授權使用的使用者使用,能被安全傳遞的一種機制。
Java Servlet,JSP中安全性通過如下幾種方式實現:
一、 Declarative Security
Declarative security指的是表達一個應用的安全結構,包括角色,存取控制,和在一個應用的外部表格單所要求的驗證。在web application中發布描述器是實施declarative security的一種主要的工具。
發行者把application所要求的邏輯完整性映射為在特定運行環境下的安全性原則。在運行時,servlet container使用這些策略來強迫驗證。
二 、Programmatic Security
當declarative security不能夠完全表達一個application的安全模型時,就可以使用programmatic Security。Programmatic Security包括HttpServletRequest介面的下列方法:
getRemoteUser
isUserInRole
getUserPrincipal
getRemoteUser方法返回經過用戶端驗證的使用者名稱。IsUserInRole向container的安全機制詢問一個特定的使用者是否在一個給定的資訊安全角色中。GetUserPrinciple方法返回一個Java.security.Pricipal對象。這些APIs根據遠端使用者的邏輯角色讓servlet去完成一些邏輯判斷。它也可以讓servlet去決定目前使用者的主要名字。如果getRemoteUser返回null值(這意味著沒有使用者被驗證),那麼isUserInRole就總會返回false,getUserPrinciple總會返回null。
三 、Roles
一個Roles就是由Application Developer和Assembler所定義的一個抽象的邏輯使用者組。當一個application被發布的時候,Deployer就把這些角色映射到在運行環境中的安全認證,例如組或規則。
一個servlet container能夠為規則執行一些說明或編程安全,這些規則是與調用這些principal的安全屬性所輸入的要求相聯絡的。例如:
1.當deployer把一個資訊安全角色映射為作業環境下的一個使用者組,調用principle所屬的使用者組就從安全屬性中獲得。如果principle的使用者組與在作業環境下的使用者組相匹配,那麼principle 就是一個資訊安全角色。
2.當deployeer把一個資訊安全角色映射為一個在安全方針域中的principle名時,調用principle的確principle名就被從安全屬性中提取出來。如果兩者相同的話,調用的principle就是安全的。
四、Authentication
一個web 客端能夠使用下面的一種機制來對網頁伺服器驗證一個使用者。
HTTP Digest Authentication
HTTPS Client Authentication
HTTP Basic Authentication
HTTP Based Authentication
五、HTTP Basic Authentication
HTTP Basic Authentication是一個定義在HTTP/1.1規範中的驗證機制。這種機制是以使用者名稱和密碼為基礎的。一個web server要求一個web client去驗證一個使用者。作為request的一部分,web server 傳遞被稱之為realm的字串,使用者就是在它裡面被驗證的。注意:Basic Authentication機制的realm字串不一定反映任何一種安全方針域。Web client得到這些使用者名稱和密碼,然後把它傳遞給web server。Web server然後在一個特定的領域驗證這些使用者。
由於密碼是使用一種64位的編碼來傳遞,而且目的server沒有驗證,所以Basic Authentication不是一種安全的驗證協議。然而一些附加的保護像使用一種安全傳輸機制(HTTPS)或在網路層使用安全措施能夠解決一些問題。
六、HTTP Digest Authentication
與HTTP Digest Authentication一樣,HTTP Digest Authentication根據使用者名稱和密碼驗證一個使用者。然而密碼的傳輸是通過一種加密的形式進行的,這就比Basic Authentication所使用的64位編碼形式傳遞要安全的多。這種方法沒有像HTTPS Client Authentication的個人密鑰方案安全。由於Digest Authentication當前不被廣泛使用,servlet containers不要求支援它但是鼓勵去支援它。
七、HTTPS Client Authentication
使用HTTPS(HTTP over SSL)的終端使用者驗證是一種嚴格非驗證機制。這種機制要求使用者去處理公用密鑰證明(Public Key Certification PKC)。當前,PKCs在e-commerce應用中是有用的。不適應J2EE的servlet containers不要求支援HTTPS協議。
八、Server Tracking of Authentication Information
就像映射在角色中的安全標識一樣,運行環境是環境的說明而不是應用的說明。
1.在web application的發布環境建立一個登入機制和策略。
2.對發布在同一個container的application能夠使用同樣的驗證資訊來代表這些application的principal。
3.僅僅當通過安全性原則域時要求使用者重新驗證。
因此,一個servlet container要求在container層來跟蹤這些驗證資訊,而不是在application層。允許一個經驗證的使用者拒絕一個使用其它資源的application,這些是通過受同樣安全性標識限制的container管理的。