1. 项目概述:为什么需要搭建Web漏洞靶场?
在网络安全领域,实战训练的重要性怎么强调都不为过。upload-labs作为国内最受欢迎的文件上传漏洞靶场之一,包含了从基础到高级的20种不同防御级别的文件上传挑战。我选择在CentOS上部署这套靶场,不仅因为它是企业服务器的主流操作系统,更因为其严格的权限管理和安全机制能真实模拟生产环境。
这个靶场特别适合以下人群:
- 刚入门Web安全的初学者
- 准备参加CTF比赛的学生
- 需要提升团队安全意识的开发工程师
- 准备安全认证考试(如OSCP)的备考者
提示:虽然靶场运行在隔离环境,但建议使用虚拟机或云服务器部署,避免意外影响主机系统。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备:CentOS系统配置要点
2.1 系统基础环境搭建
我选择的是CentOS 7.9最小化安装版本,这个长期支持版(LTS)稳定性有保障。安装时要注意几个关键点:
-
分区方案:
- /boot 分区:1GB(ext4)
- swap 分区:内存的1.5倍(当内存≤8GB时)
- / 分区:剩余所有空间(xfs文件系统)
-
网络配置:
bash复制nmcli connection modify ens192 ipv4.method manual ipv4.addresses 192.168.1.100/24 ipv4.gateway 192.168.1.1 ipv4.dns 8.8.8.8
nmcli connection up ens192
- 更新系统并安装基础工具:
bash复制yum update -y && yum install -y vim wget curl net-tools epel-release
2.2 Web服务环境安装
upload-labs需要PHP+MySQL环境,我选择MariaDB作为MySQL的替代品:
- 安装Apache和PHP:
bash复制yum install -y httpd php php-mysql php-gd php-mbstring
- 安装MariaDB数据库:
bash复制yum install -y mariadb-server mariadb
systemctl start mariadb
mysql_secure_installation
- 配置防火墙放行Web服务:
bash复制firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
3. upload-labs靶场部署实战
3.1 获取并配置靶场源码
最新版的upload-labs可以从GitHub获取:
bash复制wget https://github.com/c0ny1/upload-labs/archive/refs/heads/master.zip
unzip master.zip -d /var/www/html/
mv /var/www/html/upload-labs-master /var/www/html/upload-labs
chown -R apache:apache /var/www/html/upload-labs
配置数据库连接:
php复制// 修改/var/www/html/upload-labs/config.php
$DB_HOST = 'localhost';
$DB_USER = 'upload';
$DB_PWD = 'ComplexP@ssw0rd!';
$DB_NAME = 'upload_labs';
创建数据库用户和表结构:
sql复制CREATE DATABASE upload_labs;
CREATE USER 'upload'@'localhost' IDENTIFIED BY 'ComplexP@ssw0rd!';
GRANT ALL PRIVILEGES ON upload_labs.* TO 'upload'@'localhost';
FLUSH PRIVILEGES;
USE upload_labs;
SOURCE /var/www/html/upload-labs/install.sql;
3.2 靶场环境调优
- PHP安全配置调整(/etc/php.ini):
ini复制file_uploads = On
upload_max_filesize = 10M
post_max_size = 12M
max_execution_time = 300
allow_url_fopen = Off
allow_url_include = Off
- Apache虚拟主机配置(/etc/httpd/conf.d/upload-labs.conf):
apache复制<VirtualHost *:80>
DocumentRoot "/var/www/html/upload-labs"
ServerName upload-labs.test
<Directory "/var/www/html/upload-labs">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
- 重启服务使配置生效:
bash复制systemctl restart httpd mariadb
4. 靶场使用与安全实践
4.1 通关基础技巧
upload-labs的20个关卡循序渐进地展示了各种文件上传漏洞的利用方式:
-
前端验证绕过(Pass-01):
- 使用Burp Suite拦截请求
- 修改Content-Type为image/jpeg
- 直接发送.php文件
-
MIME类型验证绕过(Pass-02):
python复制import requests
files = {'upload_file': ('shell.jpg', '<?php phpinfo(); ?>', 'image/jpeg')}
r = requests.post("http://target/upload.php", files=files)
- 黑名单绕过技巧:
- .php5, .phtml等备用后缀
- 大小写混合(.PhP)
- 点号截断(shell.php.)
4.2 防御措施实现
每个关卡都对应着一种防御方案,例如:
- 文件内容检测(Pass-12):
php复制$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $_FILES['file']['tmp_name']);
$allowed = ['image/jpeg', 'image/png'];
if(!in_array($mime, $allowed)) {
die("Invalid file type!");
}
- 重命名防御(Pass-17):
php复制$ext = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
$new_name = md5(uniqid()).'.'.$ext;
move_uploaded_file($_FILES['file']['tmp_name'], $upload_path.$new_name);
5. 常见问题排查指南
5.1 部署问题速查表
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 访问显示403 | 目录权限不足 | chmod 755 /var/www/html |
| 数据库连接失败 | 密码错误/SELinux阻止 | setsebool -P httpd_can_network_connect_db 1 |
| 上传文件失败 | PHP配置限制 | 检查upload_max_filesize和post_max_size |
| 页面显示代码 | PHP未解析 | yum reinstall php |
5.2 靶场使用技巧
-
调试模式开启:
在config.php中设置$DEBUG = true;可以显示详细的错误信息 -
关卡重置方法:
sql复制TRUNCATE TABLE upload_labs.flag;
INSERT INTO upload_labs.flag VALUES ('this_is_flag_1'),('this_is_flag_2')...;
- 自定义关卡:
复制Pass-20文件夹修改防御逻辑,在index.php中添加新关卡链接
6. 安全加固与扩展
6.1 生产环境安全建议
虽然这是训练靶场,但建议实施以下安全措施:
- 网络隔离:
bash复制firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="http" accept'
- 定期备份:
bash复制mysqldump -u root -p upload_labs > upload_labs_$(date +%F).sql
tar czf /backup/upload-labs_$(date +%F).tar.gz /var/www/html/upload-labs
6.2 靶场功能扩展
- 添加日志审计功能:
php复制$log = sprintf("[%s] IP:%s File:%s Size:%d",
date('Y-m-d H:i:s'),
$_SERVER['REMOTE_ADDR'],
$_FILES['file']['name'],
$_FILES['file']['size']
);
file_put_contents('/var/log/upload_audit.log', $log.PHP_EOL, FILE_APPEND);
-
集成WAF测试:
在Apache前部署ModSecurity,测试规则绕过技巧 -
构建Docker版本:
dockerfile复制FROM centos:7
RUN yum install -y httpd php mariadb-server && \
yum clean all
COPY upload-labs /var/www/html
EXPOSE 80
CMD ["/usr/sbin/httpd", "-DFOREGROUND"]
在实际教学中,我发现很多学员在Pass-16(二次渲染绕过)这个关卡会遇到瓶颈。这里分享一个实用技巧:对于GIF图片,可以在文件头插入PHP代码,因为多数图像处理库会保留文件开头的注释块。而对于PNG文件,则可以考虑将代码写入pHYs块等非关键数据段。
