目录遍历致代码执行漏洞(CVE-2024-32113)分析’

目录遍历致代码执行漏洞(CVE-2024-32113)分析

先知首发 https://xz.aliyun.com/t/14733

0x01 漏洞介绍

​ Apache OFBiz是一个电子商务平台,用于构建大中型企业级、跨平台、跨数据库、跨应用服务器的多层、分布式电子商务类应用系统。2024年5月,官方发布新版本修复了CVE-2024-32113 Apache OFBiz 目录遍历致代码执行漏洞,攻击者可构造恶意请求控制服务器。建议尽快修复漏洞。

0X02 Groovy执行分析

/framework/webtools/webapp/webtools/WEB-INF/controller.xml

412-416行

1
2
3
4
5
<request-map uri="ProgramExport">
<security https="true" auth="true"/>
<response name="success" type="view" value="ProgramExport"/>
<response name="error" type="view" value="ProgramExport"/>
</request-map>

可以看到是view类型

652行写着对应配置位置

1
2
<view-map name="ProgramExport" type="screen" page="component://webtools/widget/EntityScreens.xml#ProgramExport"/>

apache-ofbiz-18.12.11/framework/webtools/widget/EntityScreens.xml

74-96行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<screen name="ProgramExport">
<section>
<actions>
<set field="titleProperty" value="PageTitleEntityExportAll"/>
<set field="tabButtonItem" value="programExport"/>
<script location="component://webtools/groovyScripts/entity/ProgramExport.groovy"/>
</actions>
<widgets>
<decorator-screen name="CommonImportExportDecorator" location="${parameters.mainDecoratorLocation}">
<decorator-section name="body">
<screenlet>
<include-form name="ProgramExport" location="component://webtools/widget/MiscForms.xml"/>
</screenlet>
<screenlet>
<platform-specific>
<html><html-template location="component://webtools/template/entity/ProgramExport.ftl"/></html>
</platform-specific>
</screenlet>
</decorator-section>
</decorator-screen>
</widgets>
</section>
</screen>

可以看见调用了

/webtools/groovyScripts/entity/ProgramExport.groovy

56-82行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    parameters.groovyProgram = groovyProgram
} else {
groovyProgram = parameters.groovyProgram
}

// Add imports for script.
def importCustomizer = new ImportCustomizer()
importCustomizer.addImport("org.apache.ofbiz.entity.GenericValue")
importCustomizer.addImport("org.apache.ofbiz.entity.model.ModelEntity")
def configuration = new CompilerConfiguration()
configuration.addCompilationCustomizers(importCustomizer)

Binding binding = new Binding()
binding.setVariable("delegator", delegator)
binding.setVariable("recordValues", recordValues)

ClassLoader loader = Thread.currentThread().getContextClassLoader()
def shell = new GroovyShell(loader, binding, configuration)
if (UtilValidate.isNotEmpty(groovyProgram)) {
try {
// Check if a webshell is not uploaded but allow "import"
if (!SecuredUpload.isValidText(groovyProgram, ["import"])) {
logError("================== Not executed for security reason ==================")
request.setAttribute("_ERROR_MESSAGE_", "Not executed for security reason")
return
}

从groovyProgram获取参数,SecuredUpload.isValidText进行黑名单检查。

ofbiz-framework/framework/security/src/main/java/org/apache/ofbiz/security/SecuredUpload.java

image-20240528084359723

其中调用getDeniedWebShellTokens();得到黑名单。

image-20240528084640609

可以看到没有对**execute()**过滤。

直接可以使用. “”.execute()执行命令,或者直接unicode编码。

0x03 目录遍历分析

https://issues.apache.org/jira/browse/OFBIZ-13006 官方给出了漏洞点,

ofbiz-framework/framework/webapp/src/main/java/org/apache/ofbiz/webapp/control

/ControlFilter.java

18.12

image-20240528085429717

18.10

image-20240528085453984

可以看到使用httpRequest.getRequestURI() 获取url,这么一看就有两种绕过的。**”../““;”**进行截断绕过filter处理。

来看看修复方式,

18.13

image-20240528090042971

equals进行判断,不一致直接抛出。

18.14

image-20240528090149107

url包含 “..” 或者**”;”** 替换为空,然后比较。

整个漏洞点很简单,绕过filter。

0x04 复现

​ 这里直接使用18.10的环境,懒得下了。

image-20240528090628895

image-20240528090651475

直接替换为18.13的framework/webapp/src/main/java/org/apache/ofbiz/webapp/control/ControlFilter.java

image-20240528091002453

可以看到,使用**”;”** 截断就可以绕过检测。

image-20240528091118823

最后也是成功执行。

0x05 修复建议

​ 升级到官网最新版本。

声明

此文章 仅用于教育目的。请负责任地使用它,并且仅在您有明确测试权限的系统上使用。滥用此 PoC 可能会导致严重后果。


目录遍历致代码执行漏洞(CVE-2024-32113)分析’
https://unam4.github.io/2024/05/28/目录遍历致代码执行漏洞(CVE-2024-32113)分析’/
作者
unam4
发布于
2024年5月28日
许可协议