文件上传(一):PortSwigger靶场通关笔记
字数 1482 2025-08-19 12:41:30
文件上传漏洞攻防实战:PortSwigger靶场通关指南
文件上传漏洞概述
文件上传漏洞是指Web应用程序对用户上传的文件缺乏完善的检验机制,导致攻击者能够上传恶意文件到服务器。这些恶意文件可被用于执行任意代码、影响客户端用户等攻击行为。
基础攻击场景
Lab1: 直接上传Web Shell执行命令
- 漏洞描述:无任何防御措施的文件上传
- 攻击方法:
- 直接上传PHP脚本文件
- 脚本内容示例:
<?php echo file_get_contents('/home/carlos/secret'); ?> - 访问上传的脚本文件获取敏感信息
Lab2: 绕过Content-Type限制
- 漏洞描述:应用仅检查Content-Type头判断文件类型
- 攻击方法:
- 上传恶意脚本文件
- 拦截请求,修改Content-Type为合法类型(如
image/jpeg) - 绕过检查成功上传
高级绕过技术
Lab3: 路径遍历上传
- 漏洞描述:应用限制上传目录的执行权限
- 攻击方法:
- 尝试使用
../进行目录遍历 - 若被过滤,尝试URL编码:
%2e%2e%2f - 上传文件到可执行目录
- 尝试使用
Lab4: 扩展名黑名单绕过
- 漏洞描述:使用黑名单机制限制文件扩展名
- 绕过技术:
- 使用非常见PHP扩展名:
.php5,.pht,.phpt,.phtml,.php3,.php4,.php6 - 大小写混淆:
.pHp - 多扩展名:
file.php.jpg(依赖服务器解析顺序) - 尾随字符:
file.php.或file.php(空格) - URL编码:
file%2ephp - 分号或空字符:
file.php;jpg或file.php%00.jpg - Unicode字符:如
xC0 xAE可能被解析为.(点)
- 使用非常见PHP扩展名:
Apache服务器特定绕过:
- 上传
.htaccess文件:
AddType application/x-httpd-php .php5
- 上传
.php5文件并访问
Lab5: 混淆扩展名
- 攻击方法:
- 使用多扩展名结合空字符:
shell.php%00.jpg - 利用服务器解析特性绕过检查
- 使用多扩展名结合空字符:
高级攻击技术
Lab6: 多态Web Shell上传
- 漏洞描述:应用检查文件内容特征
- 攻击方法:
- 使用exiftool在合法图片中插入PHP代码:
exiftool -Comment="<?php echo 'START ' . file_get_contents('/home/carlos/secret') . ' END'; ?>" input.jpg -o polyglot.php- 上传生成的"多态"文件(既是合法图片又包含恶意代码)
Lab7: 条件竞争攻击
- 漏洞描述:应用先存储后检查,检查不通过则删除
- 攻击方法:
- 使用Burp Suite Turbo Intruder插件
- 并发执行上传请求和访问请求
- 在文件被删除前快速访问
Turbo Intruder脚本示例:
def queueRequests(target, wordlists):
engine = RequestEngine(endpoint=target.endpoint, concurrentConnections=10)
# 上传请求
request1 = '''POST /upload HTTP/2...'''
# 访问请求
request2 = '''GET /files/uploaded/shell.php HTTP/2...'''
engine.queue(request1, gate='race1')
for x in range(5):
engine.queue(request2, gate='race1')
engine.openGate('race1')
engine.complete(timeout=60)
非RCE利用场景
-
存储型XSS:
- 上传包含恶意JavaScript的文件
- 当其他用户访问该文件时触发XSS攻击
-
XXE漏洞:
- 上传特殊格式文件(如docx、xls)
- 利用文件解析过程中的XXE漏洞
防御措施
-
文件扩展名验证:
- 使用白名单而非黑名单机制
- 严格限制允许的文件类型
-
文件名处理:
- 过滤目录遍历序列(
../) - 对上传文件重命名(如使用UUID)
- 过滤目录遍历序列(
-
内容验证:
- 检查文件内容与扩展名是否匹配
- 对图片进行重渲染处理
-
存储策略:
- 文件检验完成前不存入文件系统
- 存储在非Web可访问目录
-
执行限制:
- 设置上传目录无执行权限
- 使用CDN或单独域名托管用户上传内容
-
使用成熟框架:
- 避免自行实现文件上传逻辑
- 使用经过安全审计的库/框架
通过全面实施这些防御措施,可有效降低文件上传漏洞的风险。安全团队应定期进行安全测试,确保防御机制的有效性。