文件上传(一):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头判断文件类型
  • 攻击方法
    1. 上传恶意脚本文件
    2. 拦截请求,修改Content-Type为合法类型(如image/jpeg
    3. 绕过检查成功上传

高级绕过技术

Lab3: 路径遍历上传

  • 漏洞描述:应用限制上传目录的执行权限
  • 攻击方法
    • 尝试使用../进行目录遍历
    • 若被过滤,尝试URL编码:%2e%2e%2f
    • 上传文件到可执行目录

Lab4: 扩展名黑名单绕过

  • 漏洞描述:使用黑名单机制限制文件扩展名
  • 绕过技术
    1. 使用非常见PHP扩展名:.php5, .pht, .phpt, .phtml, .php3, .php4, .php6
    2. 大小写混淆:.pHp
    3. 多扩展名:file.php.jpg(依赖服务器解析顺序)
    4. 尾随字符:file.php.file.php (空格)
    5. URL编码:file%2ephp
    6. 分号或空字符:file.php;jpgfile.php%00.jpg
    7. Unicode字符:如xC0 xAE可能被解析为.(点)

Apache服务器特定绕过

  1. 上传.htaccess文件:
AddType application/x-httpd-php .php5
  1. 上传.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: 条件竞争攻击

  • 漏洞描述:应用先存储后检查,检查不通过则删除
  • 攻击方法
    1. 使用Burp Suite Turbo Intruder插件
    2. 并发执行上传请求和访问请求
    3. 在文件被删除前快速访问

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利用场景

  1. 存储型XSS

    • 上传包含恶意JavaScript的文件
    • 当其他用户访问该文件时触发XSS攻击
  2. XXE漏洞

    • 上传特殊格式文件(如docx、xls)
    • 利用文件解析过程中的XXE漏洞

防御措施

  1. 文件扩展名验证

    • 使用白名单而非黑名单机制
    • 严格限制允许的文件类型
  2. 文件名处理

    • 过滤目录遍历序列(../
    • 对上传文件重命名(如使用UUID)
  3. 内容验证

    • 检查文件内容与扩展名是否匹配
    • 对图片进行重渲染处理
  4. 存储策略

    • 文件检验完成前不存入文件系统
    • 存储在非Web可访问目录
  5. 执行限制

    • 设置上传目录无执行权限
    • 使用CDN或单独域名托管用户上传内容
  6. 使用成熟框架

    • 避免自行实现文件上传逻辑
    • 使用经过安全审计的库/框架

通过全面实施这些防御措施,可有效降低文件上传漏洞的风险。安全团队应定期进行安全测试,确保防御机制的有效性。

文件上传漏洞攻防实战: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 可能被解析为 . (点) Apache服务器特定绕过 : 上传 .htaccess 文件: 上传 .php5 文件并访问 Lab5: 混淆扩展名 攻击方法 : 使用多扩展名结合空字符: shell.php%00.jpg 利用服务器解析特性绕过检查 高级攻击技术 Lab6: 多态Web Shell上传 漏洞描述 :应用检查文件内容特征 攻击方法 : 使用exiftool在合法图片中插入PHP代码: 上传生成的"多态"文件(既是合法图片又包含恶意代码) Lab7: 条件竞争攻击 漏洞描述 :应用先存储后检查,检查不通过则删除 攻击方法 : 使用Burp Suite Turbo Intruder插件 并发执行上传请求和访问请求 在文件被删除前快速访问 Turbo Intruder脚本示例 : 非RCE利用场景 存储型XSS : 上传包含恶意JavaScript的文件 当其他用户访问该文件时触发XSS攻击 XXE漏洞 : 上传特殊格式文件(如docx、xls) 利用文件解析过程中的XXE漏洞 防御措施 文件扩展名验证 : 使用白名单而非黑名单机制 严格限制允许的文件类型 文件名处理 : 过滤目录遍历序列( ../ ) 对上传文件重命名(如使用UUID) 内容验证 : 检查文件内容与扩展名是否匹配 对图片进行重渲染处理 存储策略 : 文件检验完成前不存入文件系统 存储在非Web可访问目录 执行限制 : 设置上传目录无执行权限 使用CDN或单独域名托管用户上传内容 使用成熟框架 : 避免自行实现文件上传逻辑 使用经过安全审计的库/框架 通过全面实施这些防御措施,可有效降低文件上传漏洞的风险。安全团队应定期进行安全测试,确保防御机制的有效性。