CRMEB开源版代码审计
字数 2119 2025-08-18 11:36:57

CRMEB开源版v5.1.0代码审计报告

0x00 前言

CRMEB开源商城系统是一款全开源可商用的PHP系统。本报告详细记录了在v5.1.0版本中发现的多项安全漏洞,包括高危的远程文件操作、文件上传漏洞,以及中危的SSRF、SQL注入等问题。

0x01 环境信息

  • 系统版本:CRMEB开源版v5.1.0
  • 系统环境:Windows 11
  • PHP版本:7.4.3 NTS
  • 数据库版本:5.7.26
  • Web服务器:Nginx 1.15.11
  • 源码下载Gitee发布页

0x02 高危漏洞分析

1. 后台远程任意文件拉取(添加直播商品功能)

漏洞位置

adminapi/controller/v1/marketing/live/LiveGoods.php -> add()
services/activity/live/LiveGoodsServices.php -> add()
utils/DownloadImage.php -> downloadImage()
services/upload/storage/Local.php -> down()

漏洞详情

  • 使用readfile()函数远程获取文件
  • 仅通过黑名单(php, js, html)校验文件后缀
  • 文件名由URL的MD5值生成,格式:md5(url).ext

复现步骤

  1. 准备恶意文件help.PHP(内容:<?=phpinfo();?>)
  2. 启动HTTP服务(python -m http.server 19000)
  3. 后台路径:营销->直播管理->直播商品管理->添加商品
  4. 抓包修改image参数为http://localhost:19000/help.PHP
  5. 访问生成的文件路径:/uploads/attach/2023/09/07/749aa9192a0f6ff0ed7c34418e6fe97f.PHP

修复建议

  • 使用白名单校验文件类型
  • 禁止远程文件包含功能
  • 生成随机文件名而非URL的MD5值

2. 后台远程任意文件拉取(网络图片上传功能)

漏洞位置

adminapi/controller/v1/file/SystemAttachment.php -> onlineUpload()
services/system/attachment/SystemAttachmentServices.php -> onlineUpload()
services/product/product/CopyTaobaoServices.php -> downloadImage()
services/upload/storage/Local.php -> steam()

漏洞详情

  • 同样使用readfile()函数
  • 相同的黑名单校验机制
  • 通过/adminapi/file/online_upload接口触发

复现步骤

  1. 准备恶意文件同上
  2. 后台路径:商品->商品管理->添加商品->上传图片->网络上传
  3. 修改POST数据中的images参数为恶意URL
  4. 访问生成的文件路径

3. 后台远程任意文件拉取(添加商品功能)

漏洞位置

adminapi/controller/v1/product/StoreProduct.php -> save()
services/product/product/StoreProductServices.php -> save()
services/product/product/CopyTaobaoServices.php -> downloadCopyImage()
services/product/product/CopyTaobaoServices.php -> downloadImage()
services/upload/storage/Local.php -> steam()

漏洞详情

  • 通过商品详情的slider_imageattrs参数触发
  • 需要设置type=-1绕过某些校验
  • 同样的文件拉取和保存机制

4. 后台任意文件上传(视频上传功能)

漏洞位置

services/system/attachment/SystemAttachmentServices.php -> videoUpload()
adminapi/controller/v1/file/SystemAttachment.php -> videoUpload()

漏洞详情

  • 使用move_uploaded_file()函数
  • 文件名拼接时使用未过滤的chunkNumber参数
  • 允许路径穿越攻击

复现步骤

  1. 后台路径:商品->商品管理->添加商品->编辑器上传视频
  2. 抓包修改:
    • chunkNumber.php
    • file内容为PHP代码
    • filename可包含路径穿越字符(如../)
  3. 文件保存路径:/uploads/attach/${年}/${月}/${日}/${filename}__.php

修复建议

  • 严格校验上传文件类型
  • 过滤特殊字符和路径穿越
  • 使用随机生成的文件名

0x03 中危漏洞分析

1. 前台SSRF(获取图片base64功能)

漏洞位置
common.php -> image_to_base64()

漏洞详情

  • 使用curl_exec()发起请求
  • 支持多种协议:gopher、ldap、file等
  • 可通过code参数传递恶意payload

复现POC

{
  "image":"?.jpg",
  "code":"gopher://127.0.0.1:18000/_POST%20%2Fflag.php%20HTTP%2F1.1%0A%0DHost%3A%20127.0.0.1%3A18000%0A%0DContent-Type%3A%20application%2Fx-www-form-urlencoded%0A%0DContent-Length%3A%2036%0A%0D%0A%0Dkey%3D00f001523d0b955749ea5e3b0ca09b5f.jpg"
}

2. 任意用户注册(apple快捷登陆)

漏洞位置

api/controller/v1/LoginController.php -> appleLogin()
services/wechat/WechatServices.php -> appAuth()
services/wechat/WechatUserServices.php -> wechatOauthAfter()
services/user/UserServices.php -> setUserInfo()

漏洞详情

  • 仅需提供openId参数即可注册
  • 默认不强制绑定手机号(store_user_mobile=0)
  • 自动生成邮箱等用户信息

复现POC

{"openId":"asdasdasdqweqwe"}

3. 后台SQL注入(查看表接口详细功能)

漏洞位置

services/system/SystemDatabackupServices.php -> read()
adminapi/controller/v1/system/SystemDatabackup.php -> read()

漏洞详情

  • 直接拼接tablename参数到SQL语句
  • htmlspecialchars无法过滤SQL注入字符
  • 通过/adminapi/system/backup/read?tablename=触发

复现步骤

  1. 后台路径:维护->开发工具->数据库管理
  2. 点击"详细"按钮抓包
  3. 修改tablename参数为注入payload

0x04 总结与建议

发现的安全问题总结

  1. 多处文件操作功能未严格校验文件类型和路径
  2. 使用危险函数(readfile, move_uploaded_file)时缺乏防护
  3. 用户身份验证机制存在缺陷
  4. SQL查询未使用预编译语句
  5. 存在SSRF风险的外部请求功能

整体修复建议

  1. 输入验证

    • 所有用户输入都应进行严格校验
    • 使用白名单而非黑名单机制
    • 对文件操作相关参数进行多重校验
  2. 安全函数使用

    • 替换危险函数或增加安全防护
    • 文件操作限制在特定目录
    • 使用预编译SQL语句
  3. 权限控制

    • 加强身份验证机制
    • 关键操作增加二次验证
    • 实现最小权限原则
  4. 日志监控

    • 记录敏感操作日志
    • 设置异常行为告警
    • 定期审计系统日志

0x05 法律声明

  • 本报告仅用于安全研究和技术交流
  • 禁止用于非法用途
  • 测试需获得系统所有者授权
  • 请遵守《网络安全法》等相关法律法规

:文中涉及的漏洞已报送至CNVD、CNNVD平台。

CRMEB开源版v5.1.0代码审计报告 0x00 前言 CRMEB开源商城系统是一款全开源可商用的PHP系统。本报告详细记录了在v5.1.0版本中发现的多项安全漏洞,包括高危的远程文件操作、文件上传漏洞,以及中危的SSRF、SQL注入等问题。 0x01 环境信息 系统版本 :CRMEB开源版v5.1.0 系统环境 :Windows 11 PHP版本 :7.4.3 NTS 数据库版本 :5.7.26 Web服务器 :Nginx 1.15.11 源码下载 : Gitee发布页 0x02 高危漏洞分析 1. 后台远程任意文件拉取(添加直播商品功能) 漏洞位置 : 漏洞详情 : 使用 readfile() 函数远程获取文件 仅通过黑名单( php , js , html )校验文件后缀 文件名由URL的MD5值生成,格式: md5(url).ext 复现步骤 : 准备恶意文件 help.PHP (内容: <?=phpinfo();?> ) 启动HTTP服务( python -m http.server 19000 ) 后台路径:营销->直播管理->直播商品管理->添加商品 抓包修改 image 参数为 http://localhost:19000/help.PHP 访问生成的文件路径: /uploads/attach/2023/09/07/749aa9192a0f6ff0ed7c34418e6fe97f.PHP 修复建议 : 使用白名单校验文件类型 禁止远程文件包含功能 生成随机文件名而非URL的MD5值 2. 后台远程任意文件拉取(网络图片上传功能) 漏洞位置 : 漏洞详情 : 同样使用 readfile() 函数 相同的黑名单校验机制 通过 /adminapi/file/online_upload 接口触发 复现步骤 : 准备恶意文件同上 后台路径:商品->商品管理->添加商品->上传图片->网络上传 修改POST数据中的 images 参数为恶意URL 访问生成的文件路径 3. 后台远程任意文件拉取(添加商品功能) 漏洞位置 : 漏洞详情 : 通过商品详情的 slider_image 和 attrs 参数触发 需要设置 type=-1 绕过某些校验 同样的文件拉取和保存机制 4. 后台任意文件上传(视频上传功能) 漏洞位置 : 漏洞详情 : 使用 move_uploaded_file() 函数 文件名拼接时使用未过滤的 chunkNumber 参数 允许路径穿越攻击 复现步骤 : 后台路径:商品->商品管理->添加商品->编辑器上传视频 抓包修改: chunkNumber 为 .php file 内容为PHP代码 filename 可包含路径穿越字符(如 ../ ) 文件保存路径: /uploads/attach/${年}/${月}/${日}/${filename}__.php 修复建议 : 严格校验上传文件类型 过滤特殊字符和路径穿越 使用随机生成的文件名 0x03 中危漏洞分析 1. 前台SSRF(获取图片base64功能) 漏洞位置 : common.php -> image_to_base64() 漏洞详情 : 使用 curl_exec() 发起请求 支持多种协议:gopher、ldap、file等 可通过 code 参数传递恶意payload 复现POC : 2. 任意用户注册(apple快捷登陆) 漏洞位置 : 漏洞详情 : 仅需提供 openId 参数即可注册 默认不强制绑定手机号( store_user_mobile=0 ) 自动生成邮箱等用户信息 复现POC : 3. 后台SQL注入(查看表接口详细功能) 漏洞位置 : 漏洞详情 : 直接拼接 tablename 参数到SQL语句 htmlspecialchars 无法过滤SQL注入字符 通过 /adminapi/system/backup/read?tablename= 触发 复现步骤 : 后台路径:维护->开发工具->数据库管理 点击"详细"按钮抓包 修改 tablename 参数为注入payload 0x04 总结与建议 发现的安全问题总结 多处文件操作功能未严格校验文件类型和路径 使用危险函数( readfile , move_uploaded_file )时缺乏防护 用户身份验证机制存在缺陷 SQL查询未使用预编译语句 存在SSRF风险的外部请求功能 整体修复建议 输入验证 : 所有用户输入都应进行严格校验 使用白名单而非黑名单机制 对文件操作相关参数进行多重校验 安全函数使用 : 替换危险函数或增加安全防护 文件操作限制在特定目录 使用预编译SQL语句 权限控制 : 加强身份验证机制 关键操作增加二次验证 实现最小权限原则 日志监控 : 记录敏感操作日志 设置异常行为告警 定期审计系统日志 0x05 法律声明 本报告仅用于安全研究和技术交流 禁止用于非法用途 测试需获得系统所有者授权 请遵守《网络安全法》等相关法律法规 注 :文中涉及的漏洞已报送至CNVD、CNNVD平台。