一波五折的wordpress插件wp super cache RCE漏洞分析之旅
字数 1488 2025-08-05 08:19:35
WordPress插件WP Super Cache RCE漏洞分析教学文档
0x00 漏洞概述
WP Super Cache是WordPress的一个流行缓存插件,2021年3月曝出其1.7.1版本存在远程代码执行漏洞(CVE-2021-24345)。该漏洞属于"写入配置文件getshell"类型,需要攻击者具备WordPress后台管理员权限。
0x01 漏洞分析
关键函数说明
trailingslashit(): 调用untrailingslashit()并在末尾添加/untrailingslashit(): 移除字符串右侧的\和/两个字符dirname(): 返回路径中的目录名称部分realpath(): 返回绝对路径,删除所有符号连接basename(): 返回路径中的文件名部分rtrim(): 移除字符串右侧的空白字符或其他预定义字符
漏洞原理
漏洞位于插件设置中的缓存路径修改功能,用户可控的$cache_path变量被直接写入wp-cache-config.php配置文件,导致代码注入。
0x02 漏洞复现
环境准备
- WordPress 5.8
- WP Super Cache 1.4.8
- PHPStudy环境
- PHP 7.0.12
- MySQL 5.5.53
漏洞利用步骤
- 以管理员身份登录WordPress后台
- 进入WP Super Cache设置页面(选项 > WP Super Cache)
- 在"缓存位置"输入框中输入恶意payload
- 提交保存设置
有效Payload
- 基础payload:
';system($_GET[0]);#
- 替代payload:
/cache/';system($_GET[0]);?><!--
- 完整路径payload示例:
D:\wordpress_path/cache/';system($_GET[0]);#
执行命令
保存后,访问以下URL执行命令:
http://example.com/wp-admin/options-general.php?page=wpsupercache&tab=settings&0=whoami
0x03 技术细节分析
关键代码流程
- 用户输入通过
$_POST['wp_cache_location']接收 - 经过
dirname()处理后,部分特殊字符会被移除 realpath()处理可能导致路径返回false- 最终
$cache_path被写入配置文件
绕过技巧
- 必须保留
/cache/路径部分,或改为已存在的缓存文件夹 - 避免在中括号内使用单引号,如
$_GET['x']会导致失败 - 使用
#而非//进行注释,因为basename()会移除//
调试发现
- 当payload中包含
\';system($_GET[\'x\']);#时,dirname()会异常处理 realpath()可能返回false导致使用默认路径- 这些处理导致无法进入写入配置文件的代码分支
0x04 漏洞修复
WP Super Cache 1.7.4版本增加了正则表达式过滤,移除特殊字符:
preg_replace('/[ <>\'\"\r\n\t
$$
]/', '', $string)
修复后难以绕过,因为:
- 配置文件格式严格,错误的格式会导致报错
- 特殊字符被过滤,难以构造有效payload
0x05 防御建议
- 及时更新WP Super Cache到最新版本
- 对配置文件写入操作进行严格过滤
- 限制WordPress后台访问权限
- 监控
wp-cache-config.php文件的修改
0x06 经验总结
- 漏洞分析时不要轻信网上的payload,需自行验证
- 排查问题要系统化:权限→版本→输入处理→特殊字符
- 动态调试是解决复杂问题的有效手段
- payload应尽量精简,减少特殊字符使用
- 遇到困难时可暂时休息,换个思路可能找到解决方案
0x07 参考资料
- Exploit-DB: WP Super Cache 1.7.1 RCE
- WordPress官方插件目录
- WP Super Cache更新日志