歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

對WebLogic漏洞及補丁的分析

來源:本站整理 作者:佚名 時間:2019-09-23 TAG: 我要投稿

今年早些時候,有研究人員發現并公布了Oracle WebLogic中的一個反序列化漏洞。這個漏洞比較嚴重,因此Oracle打破正常按季度發布補丁的慣例,專門發布緊急更新。不幸的是,研究人員很快就意識到攻擊者有可能繞過這個補丁。
官方補丁有時候不能完全解決某個安全問題,這似乎是現在的一個趨勢,Oracle也不例外。本文介紹了一個目錄遍歷漏洞,官方通過多次補丁才修復該漏洞。Oracle最早在2019年4月份通過CVE-2019-2618修復這個漏洞,但隨后又在7月份發布了修正補丁。
 
0x01 漏洞細節
Oracle WebLogic是用來構建和部署Java Enterprise Edition(EE)應用的應用服務器。在默認安裝下,WebLogic服務器會包含各種應用,以便維持和配置相關域名及應用。比如其中有個bea_wls_deployment_internal.war應用,該應用有個上傳文件功能。通過身份認證后,用戶可以向/bea_wls_deployment_internal/DeploymentService發送請求來上傳文件。
如果請求頭部中的wl_request_type值為app_upload或者plan_upload,那么應用就會調用handlePlanOrApplicationUpload()。handlePlanOrApplicationUpload()方法會驗證wl_upload_application_name字段值,并且會檢查兩種目錄遍歷字符:../以及/..:

圖1. 檢查目錄遍歷字符(這里我們添加了一些注釋)
\user_projects\domains\[DOMAIN NAME]\servers\AdminServer\upload\路徑存儲在uploadingDirName變量中,服務器將wl_upload_application_name字段值作為該路徑的子目錄來使用。如圖1代碼中所示,服務端會將用戶可控的wl_upload_application_name值附加到uploadingDirName中,然后以saveDirectory參數形式傳遞給doUploadFile()。doUploadFile()函數會使用請求中的文件名參數在該位置創建一個文件。

圖2. doUploadFile()函數
wl_upload_application_name以及filename字段都存在目錄遍歷漏洞。2019年4月,Oracle嘗試通過CVE-2019-2618修復這個目錄遍歷問題。在CVE-2019-2618補丁中,官方加了一些處理邏輯,在wl_upload_application_name字段中又檢查了兩種目錄遍歷字符:..以及..:

對于filename字段,CVE-2019-2618補丁中對doUploadFile()新增了一處檢查,確保保存文件的最終路徑包含saveDir所指定的正確目錄。saveDir的值為\user_projects\domains\[DOMAIN NAME]\servers\AdminServer\upload\[UPLOAD_APP],其中[UPLOAD_APP]的值位于wl_upload_application_name中。如果filename變量包含目錄遍歷字符,并且不包含saveDir指示的字符串,那么新的doUploadFile()方法就會拋出異常:

圖4. 針對saveDir的異常錯誤
針對fileName字段的檢查基本已經比較完善,然而這里我們想提一下,如果官方不使用contains,而是使用startsWith來進行判斷,那么修復的效果應該會更好。根據這個補丁的處理邏輯,從理論上講,如果最終路徑中任何一部分與合法的保存路徑相似,那么就能繞過這個補丁。然而經過我們的分析,這里并沒有直接可以利用的代碼路徑。如果saveTo指定的路徑不存在,那么doUploadFile()函數不會自動創建對應的目錄結構。因此,如果想繞過這個補丁,攻擊者需要使用其他足夠強大的技術,在服務器上的敏感位置創建任意目錄結構,但本身這里無法提供文件上傳功能。因此總的說來,這個補丁不大可能被繞過。
然而,對于wl_upload_application_name頭部字段,CVE-2019-2618補丁就沒有做好,攻擊者可以將wl_upload_application_name頭部字段值設置為..(兩個點)來繞過該補丁。通過這種方式,攻擊者可以將文件上傳到\user_projects\domains\[DOMAIN NAME]\servers\AdminServer目錄的任意子目錄(要注意的是這里缺少一個最終路徑組件:upload)。因此,攻擊者可以在\user_projects\domains\[DOMAIN NAME]\servers\AdminServer\tmp\目錄中寫入一個JSP文件,實現代碼執行。例如,攻擊者可以通過如下POST請求,將poc.jsp文件寫入\user_projects\domains\[DOMAIN NAME]\servers\AdminServer\tmp目錄中:

圖5. 目錄遍歷漏洞演示
攻擊者無需通過身份認證,就可以訪問已寫到tmp目錄下_WL_internalbea_wls_internal子目錄中的文件。對于這個案例,攻擊者可以向/bea_wls_internal/pos.jsp這個URI發送請求,就能執行JSP代碼。
官方在7月份發布了CVE-2019-2827補丁,成功修復了該漏洞。補丁會驗證wl_upload_application_name頭部字段值中是否包含..目錄遍歷字符,如下所示:

圖6. CVE-2019-2827補丁改動的代碼
 
0x02 總結
目錄遍歷漏洞的各種變種已經出現有一段時間,但依然會影響多種類型的軟件。開發者應該確保自己在執行文件操作之前已經正確過濾了用戶輸入數據。多年以來,攻擊者一直在使用各種編碼技巧來繞過針對目錄遍歷的防御機制。比如,攻擊者可以使用URI編碼,將%2e%2e%2f轉換為../來繞過某些過濾器,我們永遠不要低估這些人的創造力。
雖然本文介紹的是來自Oracle的一個不成功的補丁,但其他廠商也存在類似問題。對補丁的分析是檢測開發者是否存在紕漏的一個好方法,檢查被修復的組件同樣是尋找相關漏洞的絕佳切入點。
 

【聲明】:黑吧安全網(http://www.gkrbnd.live)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        福彩原副主任