某CRM代码审计(PHP)
字数 1752 2025-08-29 08:30:06

某CRM系统PHP代码审计报告

系统架构分析

该系统采用MVC(Model-View-Controller)架构设计,主要目录结构如下:

核心架构组件

  • modules/: 存放业务模块,对应MVC中的Controller层
  • database/、data/、dataCache/: 数据库和数据缓存相关逻辑,属于Model层

功能模块

  • crmapi/: API接口目录,用于前后端交互和第三方系统对接
  • adodb/、mssql/、msAccess/、sql/、sqlparser/: 数据库支持相关,使用ADOdb作为数据库抽象层
  • cron/: 定时任务目录,用于执行自动化脚本
  • logs/、log4php/、log4php.debug/: 日志管理系统,使用log4php
  • packages/、expansion/、Smarty/: 第三方插件和系统扩展,使用Smarty模板引擎

前端相关

  • jsCalendar/、MultiDatesPicker/、My97DatePicker/: 前端控件
  • kcfinder/: 文件上传管理工具

安全与配置

  • 360safe/: 360安全防护集成
  • config.db.php、config.inc.php: 系统配置文件,包含敏感信息

第三方集成

  • CallCenter/: 呼叫中心系统集成
  • wechatpay/、wechatSession/、WeiXinApp/: 微信支付和微信登录功能

漏洞分析

1. SSRF漏洞

漏洞位置: marketing/index.php

利用方式:

xxx/marketing/index.php?module=Articles&action=copyLinkToContent&userid=11&logincrm_userid=11&publicaccount=12&url=http://xxx

漏洞细节:

  • WxCrawler类中存在file_get_content调用,且URL参数可控
  • 由于只有return没有输出函数,只能用于SSRF攻击
  • 读取文件内容时会触发if检测,强制退出进程
  • 需要找到new WxArticles的调用点并通过copy方法触发

2. SQL注入漏洞

漏洞位置: WxOrder类的getOrderList方法

漏洞细节:

  • crm_user_id参数直接拼接到SQL语句中
  • 该目录未包含360safe中的过滤代码
  • 可构造时间盲注payload,如延迟4秒的语法

3. 任意文件上传漏洞

利用链:

  1. 通过index.php结尾的include函数,控制module参数请求Upload/uploadfile.php
  2. 需要绕过两个条件判断:
    • if(empty($openid))
    • if(empty($_REQUEST['usid']))
  3. 文件上传逻辑在WeiXinAppuploadfile
  4. 通过request参数未签名时调用upload_save_file方法

漏洞细节:

  • 文件编码转换和路径拼接无后缀过滤
  • 存在move_uploaded_file调用但目录权限问题导致失败
  • 可利用php://input伪协议:
    • 通过file_info传入{name:"1.php"}的JSON格式
    • php://input接收木马内容

4. 任意文件读取漏洞

漏洞细节:

  • 直接使用file_get_contents读取文件内容
  • 可构造绝对路径直接读取系统文件

审计方法论

  1. 架构分析:首先分析系统目录结构和架构设计
  2. 路由追踪:分析请求如何路由到具体模块和方法
  3. 敏感函数追踪:查找file_get_contentsinclude、SQL拼接等危险函数
  4. 参数可控性分析:检查用户输入是否未经过滤直接使用
  5. 权限与条件绕过:分析条件判断是否可绕过
  6. 伪协议利用:检查php://等伪协议的使用情况

防御建议

  1. 输入验证:对所有用户输入进行严格过滤
  2. 参数化查询:使用预处理语句防止SQL注入
  3. 文件操作限制
    • 限制文件操作目录
    • 验证文件后缀和内容
  4. URL访问控制
    • 限制内部服务访问
    • 使用白名单机制
  5. 权限控制
    • 严格的文件系统权限
    • 最小权限原则
  6. 安全配置
    • 禁用危险PHP函数
    • 限制伪协议使用

通过全面审计该CRM系统,发现了多处高危漏洞,这些漏洞均可被利用进行服务器入侵和数据泄露。建议开发者按照防御建议进行全面修复。

某CRM系统PHP代码审计报告 系统架构分析 该系统采用MVC(Model-View-Controller)架构设计,主要目录结构如下: 核心架构组件 modules/ : 存放业务模块,对应MVC中的Controller层 database/、data/、dataCache/ : 数据库和数据缓存相关逻辑,属于Model层 功能模块 crmapi/ : API接口目录,用于前后端交互和第三方系统对接 adodb/、mssql/、msAccess/、sql/、sqlparser/ : 数据库支持相关,使用ADOdb作为数据库抽象层 cron/ : 定时任务目录,用于执行自动化脚本 logs/、log4php/、log4php.debug/ : 日志管理系统,使用log4php packages/、expansion/、Smarty/ : 第三方插件和系统扩展,使用Smarty模板引擎 前端相关 jsCalendar/、MultiDatesPicker/、My97DatePicker/ : 前端控件 kcfinder/ : 文件上传管理工具 安全与配置 360safe/ : 360安全防护集成 config.db.php、config.inc.php : 系统配置文件,包含敏感信息 第三方集成 CallCenter/ : 呼叫中心系统集成 wechatpay/、wechatSession/、WeiXinApp/ : 微信支付和微信登录功能 漏洞分析 1. SSRF漏洞 漏洞位置 : marketing/index.php 利用方式 : 漏洞细节 : WxCrawler 类中存在 file_get_content 调用,且URL参数可控 由于只有return没有输出函数,只能用于SSRF攻击 读取文件内容时会触发if检测,强制退出进程 需要找到 new WxArticles 的调用点并通过 copy 方法触发 2. SQL注入漏洞 漏洞位置 : WxOrder 类的 getOrderList 方法 漏洞细节 : crm_user_id 参数直接拼接到SQL语句中 该目录未包含360safe中的过滤代码 可构造时间盲注payload,如延迟4秒的语法 3. 任意文件上传漏洞 利用链 : 通过 index.php 结尾的 include 函数,控制 module 参数请求 Upload/uploadfile.php 需要绕过两个条件判断: if(empty($openid)) if(empty($_REQUEST['usid'])) 文件上传逻辑在 WeiXinApp 的 uploadfile 中 通过 request 参数未签名时调用 upload_save_file 方法 漏洞细节 : 文件编码转换和路径拼接无后缀过滤 存在 move_uploaded_file 调用但目录权限问题导致失败 可利用 php://input 伪协议: 通过 file_info 传入 {name:"1.php"} 的JSON格式 php://input 接收木马内容 4. 任意文件读取漏洞 漏洞细节 : 直接使用 file_get_contents 读取文件内容 可构造绝对路径直接读取系统文件 审计方法论 架构分析 :首先分析系统目录结构和架构设计 路由追踪 :分析请求如何路由到具体模块和方法 敏感函数追踪 :查找 file_get_contents 、 include 、SQL拼接等危险函数 参数可控性分析 :检查用户输入是否未经过滤直接使用 权限与条件绕过 :分析条件判断是否可绕过 伪协议利用 :检查 php:// 等伪协议的使用情况 防御建议 输入验证 :对所有用户输入进行严格过滤 参数化查询 :使用预处理语句防止SQL注入 文件操作限制 : 限制文件操作目录 验证文件后缀和内容 URL访问控制 : 限制内部服务访问 使用白名单机制 权限控制 : 严格的文件系统权限 最小权限原则 安全配置 : 禁用危险PHP函数 限制伪协议使用 通过全面审计该CRM系统,发现了多处高危漏洞,这些漏洞均可被利用进行服务器入侵和数据泄露。建议开发者按照防御建议进行全面修复。