一波五折的wordpress插件wp super cache RCE漏洞分析之旅
字数 1360 2025-08-05 08:19:35

WordPress插件WP Super Cache RCE漏洞分析与利用

漏洞概述

  • 漏洞类型: 远程代码执行(RCE)
  • 影响版本: WP Super Cache 1.7.1及以下版本
  • 漏洞条件: 需要认证(后台管理员权限)
  • 漏洞本质: 配置文件写入导致的代码执行
  • CVE编号: 未提及
  • 披露时间: 2021年3月

漏洞原理

该漏洞属于典型的"写入配置文件getshell"类型,攻击者通过控制缓存路径参数,向wp-cache-config.php配置文件注入恶意PHP代码。

关键函数分析

  1. trailingslashit(): 调用untrailingslashit()并在末尾添加/
  2. untrailingslashit(): 移除字符串右侧的\和/两个字符
  3. dirname(): 返回路径中的目录名称部分
  4. realpath(): 返回绝对路径,删除所有符号连接
  5. basename(): 返回路径中的文件名部分
  6. rtrim(): 移除字符串右侧的空白字符或其他预定义字符

漏洞触发点

漏洞位于缓存路径参数的处理逻辑中,用户可控的$cache_path变量被直接写入配置文件:

$cache_path = 'evil_input'; //Added by WP-Cache Manager

漏洞利用

有效Payload构造

  1. 基本Payload:

    ';system($_GET[0]);#
    
  2. 替代Payload:

    /cache/';system($_GET[0]);?><!--
    

利用条件

  1. 必须保留/cache/路径前缀或使用已存在的缓存文件夹
  2. 不能在中括号内使用单引号(如$_GET['x']),否则会导致路径处理异常

利用步骤

  1. 以管理员身份登录WordPress后台
  2. 访问WP Super Cache设置页面
  3. 在缓存位置输入框中输入恶意Payload
  4. 提交保存设置
  5. 访问触发URL执行命令:
    http://target/wp-admin/options-general.php?page=wpsupercache&tab=settings&0=whoami
    

漏洞分析过程

分析波折

  1. 不可写问题排查:

    • 检查文件系统权限
    • 验证正常值能否写入
    • 确认PHP运行权限足够
  2. 版本问题排查:

    • 测试1.7.1和1.4.8版本
    • 确认漏洞与版本无关
  3. 关键代码测试:

    • 提取关键代码单独测试
    • 确认Payload在独立环境中有效
  4. 输入处理排查:

    • 检查是否有输入过滤
    • 确认$_POST['wp_cache_location']接收原始输入
  5. 特殊字符排查:

    • 逐步测试Payload中的特殊字符
    • 发现中括号内单引号导致问题

动态调试发现

  1. dirname()处理后'];#字符丢失
  2. realpath()处理带有转义单引号的路径返回false
  3. 导致$dir赋值为默认路径WP_CONTENT_DIR . '/cache/'
  4. 无法进入写入配置文件的if分支

漏洞修复

WP Super Cache 1.7.4版本增加了正则替换特殊字符的防护措施:

// 新增了特殊字符过滤

经验总结

  1. 不要盲目相信网上公开的漏洞分析和Payload
  2. 排查问题要系统化,逐步排除可能性
  3. 注意细节,特殊字符可能导致意外行为
  4. Payload应尽量精简,避免不必要特殊字符
  5. 遇到困难时可暂时休息,换角度思考

参考资源

附录

测试环境配置

  • WordPress 5.8
  • WP Super Cache 1.4.8
  • PHPStudy环境
  • PHP 7.0.12
  • MySQL 5.5.53

相关函数详细说明

(此处可补充各关键PHP函数的详细说明和使用示例)

WordPress插件WP Super Cache RCE漏洞分析与利用 漏洞概述 漏洞类型 : 远程代码执行(RCE) 影响版本 : WP Super Cache 1.7.1及以下版本 漏洞条件 : 需要认证(后台管理员权限) 漏洞本质 : 配置文件写入导致的代码执行 CVE编号 : 未提及 披露时间 : 2021年3月 漏洞原理 该漏洞属于典型的"写入配置文件getshell"类型,攻击者通过控制缓存路径参数,向 wp-cache-config.php 配置文件注入恶意PHP代码。 关键函数分析 trailingslashit() : 调用untrailingslashit()并在末尾添加/ untrailingslashit() : 移除字符串右侧的\和/两个字符 dirname() : 返回路径中的目录名称部分 realpath() : 返回绝对路径,删除所有符号连接 basename() : 返回路径中的文件名部分 rtrim() : 移除字符串右侧的空白字符或其他预定义字符 漏洞触发点 漏洞位于缓存路径参数的处理逻辑中,用户可控的 $cache_path 变量被直接写入配置文件: 漏洞利用 有效Payload构造 基本Payload : 替代Payload : 利用条件 必须保留 /cache/ 路径前缀或使用已存在的缓存文件夹 不能在中括号内使用单引号(如 $_GET['x'] ),否则会导致路径处理异常 利用步骤 以管理员身份登录WordPress后台 访问WP Super Cache设置页面 在缓存位置输入框中输入恶意Payload 提交保存设置 访问触发URL执行命令: 漏洞分析过程 分析波折 不可写问题排查 : 检查文件系统权限 验证正常值能否写入 确认PHP运行权限足够 版本问题排查 : 测试1.7.1和1.4.8版本 确认漏洞与版本无关 关键代码测试 : 提取关键代码单独测试 确认Payload在独立环境中有效 输入处理排查 : 检查是否有输入过滤 确认 $_POST['wp_cache_location'] 接收原始输入 特殊字符排查 : 逐步测试Payload中的特殊字符 发现中括号内单引号导致问题 动态调试发现 dirname() 处理后 '];# 字符丢失 realpath() 处理带有转义单引号的路径返回false 导致 $dir 赋值为默认路径 WP_CONTENT_DIR . '/cache/' 无法进入写入配置文件的if分支 漏洞修复 WP Super Cache 1.7.4版本增加了正则替换特殊字符的防护措施: 经验总结 不要盲目相信网上公开的漏洞分析和Payload 排查问题要系统化,逐步排除可能性 注意细节,特殊字符可能导致意外行为 Payload应尽量精简,避免不必要特殊字符 遇到困难时可暂时休息,换角度思考 参考资源 Exploit-DB条目 WordPress官方插件仓库 PHP函数官方文档 附录 测试环境配置 WordPress 5.8 WP Super Cache 1.4.8 PHPStudy环境 PHP 7.0.12 MySQL 5.5.53 相关函数详细说明 (此处可补充各关键PHP函数的详细说明和使用示例)