某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. 任意文件上传漏洞
利用链:
- 通过
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系统,发现了多处高危漏洞,这些漏洞均可被利用进行服务器入侵和数据泄露。建议开发者按照防御建议进行全面修复。