WordPress Crelly Slider插件从任意文件上传到RCE漏洞分析
字数 1438 2025-08-26 22:11:39

WordPress Crelly Slider插件任意文件上传到RCE漏洞分析

漏洞概述

WordPress Crelly Slider是一个开源的幻灯片插件,允许用户使用拖放生成器添加文本、图像和视频内容。该插件在1.3.4及更低版本中存在严重的任意文件上传漏洞,可导致远程代码执行(RCE)。

漏洞影响

  • 影响版本:1.3.4及更低版本
  • 影响范围:20,000+活动安装
  • 利用条件:任意经过身份验证的用户(包括最低权限的订阅者身份)

漏洞原理

1. 权限验证缺陷

插件在crelly-slider/crellyslider.php文件中错误地使用is_admin()函数进行权限验证:

if(is_admin()) {
    require_once 'wordpress/ajax.php';
}

is_admin()函数仅判断当前请求是否针对管理界面页面,并不验证用户权限。任何访问后台文件(如wp-admin/admin-ajax.php)的请求都会使is_admin()返回true。

2. 文件上传处理流程

  1. 插件注册了一个名为wp_ajax_crellyslider_importSlider的AJAX action,指向crellyslider_importSlider_callback方法
  2. 通过构造URL:http://example.com/wp-admin/admin-ajax.php?action=crellyslider_importSlider可调用该方法
  3. crellyslider_importSlider_callback调用crellyslider_importSlider方法处理上传的ZIP文件
  4. 上传的ZIP文件被解压到/wordpress/temp/目录

3. 权限绕过

由于权限验证缺陷,即使是订阅者(Subscriber)权限的用户也可以:

  • 上传任意ZIP文件
  • 将其中包含的恶意PHP文件解压到服务器可访问目录

漏洞复现步骤

  1. 准备恶意文件

    • 创建包含PHP代码的webshell文件(如webshell.php
    • 将其压缩为webshell.zip
  2. 获取低权限用户凭证

    • 注册或获取一个订阅者(Subscriber)权限的账户
  3. 发送恶意请求

    POST /wp-admin/admin-ajax.php?action=crellyslider_importSlider HTTP/1.1
    Host: example.com
    Cookie: [订阅者用户的Cookie]
    Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryxxxx
    
    ------WebKitFormBoundaryxxxx
    Content-Disposition: form-data; name="import_file"; filename="webshell.zip"
    Content-Type: application/zip
    
    [webshell.zip的二进制内容]
    ------WebKitFormBoundaryxxxx--
    
  4. 访问webshell

    • 上传成功后,访问http://example.com/wp-content/plugins/crelly-slider/wordpress/temp/webshell.php
    • 恶意代码将被执行

漏洞修复方案

插件开发者通过以下方式修复了该漏洞:

  1. crellyslider.php中定义常量:

    define('CS_MIN_CAPABILITY', 'manage_options');
    
  2. 在调用AJAX方法前添加正确的权限验证:

    if(!current_user_can(CS_MIN_CAPABILITY)) {
        die();
    }
    

manage_options是WordPress中管理插件和主题选项所需的权限,只有管理员(Administrator)或具有相应权限的用户才能执行相关操作。

安全建议

  1. 及时更新:使用Crelly Slider插件的用户应立即升级到最新版本
  2. 权限控制
    • 遵循最小权限原则
    • 避免使用低权限账户访问管理后台
  3. 代码审计
    • 正确理解WordPress权限验证机制
    • 避免混淆is_admin()和用户权限验证
  4. 文件上传限制
    • 严格限制上传文件类型
    • 将上传文件存储在Web根目录外或配置为不可执行

总结

该漏洞展示了权限验证不当和文件上传处理不当可能导致的严重后果。开发者应:

  • 正确使用WordPress权限验证函数
  • 对用户上传内容进行严格过滤和限制
  • 遵循安全编码最佳实践
WordPress Crelly Slider插件任意文件上传到RCE漏洞分析 漏洞概述 WordPress Crelly Slider是一个开源的幻灯片插件,允许用户使用拖放生成器添加文本、图像和视频内容。该插件在1.3.4及更低版本中存在严重的任意文件上传漏洞,可导致远程代码执行(RCE)。 漏洞影响 影响版本:1.3.4及更低版本 影响范围:20,000+活动安装 利用条件:任意经过身份验证的用户(包括最低权限的订阅者身份) 漏洞原理 1. 权限验证缺陷 插件在 crelly-slider/crellyslider.php 文件中错误地使用 is_admin() 函数进行权限验证: is_admin() 函数仅判断当前请求是否针对管理界面页面, 并不验证用户权限 。任何访问后台文件(如 wp-admin/admin-ajax.php )的请求都会使 is_admin() 返回true。 2. 文件上传处理流程 插件注册了一个名为 wp_ajax_crellyslider_importSlider 的AJAX action,指向 crellyslider_importSlider_callback 方法 通过构造URL: http://example.com/wp-admin/admin-ajax.php?action=crellyslider_importSlider 可调用该方法 crellyslider_importSlider_callback 调用 crellyslider_importSlider 方法处理上传的ZIP文件 上传的ZIP文件被解压到 /wordpress/temp/ 目录 3. 权限绕过 由于权限验证缺陷,即使是订阅者(Subscriber)权限的用户也可以: 上传任意ZIP文件 将其中包含的恶意PHP文件解压到服务器可访问目录 漏洞复现步骤 准备恶意文件 : 创建包含PHP代码的webshell文件(如 webshell.php ) 将其压缩为 webshell.zip 获取低权限用户凭证 : 注册或获取一个订阅者(Subscriber)权限的账户 发送恶意请求 : 访问webshell : 上传成功后,访问 http://example.com/wp-content/plugins/crelly-slider/wordpress/temp/webshell.php 恶意代码将被执行 漏洞修复方案 插件开发者通过以下方式修复了该漏洞: 在 crellyslider.php 中定义常量: 在调用AJAX方法前添加正确的权限验证: manage_options 是WordPress中管理插件和主题选项所需的权限,只有管理员(Administrator)或具有相应权限的用户才能执行相关操作。 安全建议 及时更新 :使用Crelly Slider插件的用户应立即升级到最新版本 权限控制 : 遵循最小权限原则 避免使用低权限账户访问管理后台 代码审计 : 正确理解WordPress权限验证机制 避免混淆 is_admin() 和用户权限验证 文件上传限制 : 严格限制上传文件类型 将上传文件存储在Web根目录外或配置为不可执行 总结 该漏洞展示了权限验证不当和文件上传处理不当可能导致的严重后果。开发者应: 正确使用WordPress权限验证函数 对用户上传内容进行严格过滤和限制 遵循安全编码最佳实践