代码审计&漏洞分析: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'));

绕过思考

  • 配合代码中的其他操作如urldecodebase64_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()方法

漏洞成因

  • 缺乏完善的鉴权机制
  • 任何有后台访问权限的用户都可以修改其他管理员密码

复现步骤

  1. 创建自定义角色权限(如"ceshi")
  2. 添加管理员用户并分配该角色(如"ceshi1")
  3. 使用"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 文件上传漏洞

分析说明

  • 未成功复现
  • 代码中对文件后缀名进行了限制
  • 需要进一步研究绕过方式

四、审计总结

  1. SQL注入

    • 主要问题:使用PDO但未正确绑定参数,直接拼接SQL
    • 关键点:MATCH AGAINST结构中的表达式注入
  2. 文件操作漏洞

    • 问题:未过滤路径遍历字符(如../
    • 关键点:fopen()fread()等函数的参数控制
  3. 权限漏洞

    • 问题:缺乏完善的权限检查机制
    • 关键点:功能函数中的权限验证缺失
  4. XSS漏洞

    • 问题:输入过滤不足,前端未正确处理
    • 关键点:Vue.js模板注入特性
  5. 审计方法论

    • 从可控点和高危函数出发
    • 关注输入过滤和代码逻辑
    • 特别注意PDO使用方式(是否真正绑定参数)

五、防御建议

  1. 输入过滤

    • 对所有用户输入进行严格过滤
    • 使用白名单机制限制输入内容
  2. SQL安全

    • 始终使用参数化查询
    • 避免直接拼接SQL语句
  3. 文件操作

    • 限制可访问的文件目录
    • 过滤特殊字符如../
  4. 权限控制

    • 实施最小权限原则
    • 关键操作增加权限验证
  5. XSS防御

    • 输出编码
    • 使用DOM净化库如dompurify
  6. 安全开发

    • 遵循安全编码规范
    • 定期进行代码审计和安全测试
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 未进行充分过滤 直接使用用户可控的输入作为文件路径 关键代码分析 : 利用方式 : 修复建议 : 对 $url 参数进行严格过滤,禁止 ../ 等路径遍历字符 限制可访问的文件目录范围 2. v3.5.1 SQL注入漏洞 (CNVD-2022-61443, CVE-2022-33095) 漏洞位置 : v1_0/controller/home/Jobfairol.php 中的 keyword 参数 漏洞成因 : 使用PDO但未正确使用参数绑定 直接拼接用户输入到SQL语句中 仅对输入进行 trim() 操作,无其他过滤 关键代码分析 : 利用方式 : MATCH AGAINST结构分析 : col :要搜索的列 expr :检索的关键字(漏洞点) modifier :搜索模式(可选) 修复代码 : 后续版本增加了 addslashes 过滤: 绕过思考 : 配合代码中的其他操作如 urldecode 、 base64_decode GBK编码下的宽字节注入(未成功) 3. v3.5.1 Job.php SQL注入 (CVE-2022-33092) 漏洞位置 : v1_0/controller/home/Job.php 中的 keyword 参数 关键代码 : 利用方式 : 其他参数分析 : $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 利用方式 : Vue.js模板注入原理 : Vue.js作为客户端模板框架,会将用户输入嵌入模板中,恶意输入可能被错误解析执行。 6. v3.13.0 文件上传漏洞 分析说明 : 未成功复现 代码中对文件后缀名进行了限制 需要进一步研究绕过方式 四、审计总结 SQL注入 : 主要问题:使用PDO但未正确绑定参数,直接拼接SQL 关键点: MATCH AGAINST 结构中的表达式注入 文件操作漏洞 : 问题:未过滤路径遍历字符(如 ../ ) 关键点: fopen() 、 fread() 等函数的参数控制 权限漏洞 : 问题:缺乏完善的权限检查机制 关键点:功能函数中的权限验证缺失 XSS漏洞 : 问题:输入过滤不足,前端未正确处理 关键点:Vue.js模板注入特性 审计方法论 : 从可控点和高危函数出发 关注输入过滤和代码逻辑 特别注意PDO使用方式(是否真正绑定参数) 五、防御建议 输入过滤 : 对所有用户输入进行严格过滤 使用白名单机制限制输入内容 SQL安全 : 始终使用参数化查询 避免直接拼接SQL语句 文件操作 : 限制可访问的文件目录 过滤特殊字符如 ../ 权限控制 : 实施最小权限原则 关键操作增加权限验证 XSS防御 : 输出编码 使用DOM净化库如 dompurify 安全开发 : 遵循安全编码规范 定期进行代码审计和安全测试