Pikachu靶场-Unsafe Fileupload
字数 898 2025-08-11 21:26:33

不安全的文件上传漏洞教学文档

1. 漏洞概述

文件上传功能在Web应用中非常常见(如头像上传、附件上传等)。当后台对上传文件的安全判断不足时,攻击者可能上传恶意文件(如Webshell),导致服务器被控制。

安全设计要点:

  • 验证文件类型、后缀名、大小
  • 验证文件上传方式
  • 对文件进行复杂重命名
  • 不暴露文件上传后的路径

2. 客户端检查绕过(Client Check)

漏洞分析

前端JavaScript验证文件扩展名:

function checkFileExt(filename) {
    var flag = false;
    var arr = ["jpg","png","gif"]; // 允许的扩展名
    var index = filename.lastIndexOf(".");
    var ext = filename.substr(index+1);
    
    for(var i=0;i<arr.length;i++) {
        if(ext == arr[i]) {
            flag = true;
            break;
        }
    }
    
    if(!flag) {
        alert("上传的文件不符合要求,请重新选择!");
        location.reload(true);
    }
}

绕过方法

  1. 禁用浏览器JavaScript:
    • 火狐/Chrome浏览器禁用JS后可直接上传PHP文件
  2. 访问上传路径:
    http://x.x.x.x/vul/unsafeupload/uploads/phpinfo.php
    

3. MIME类型验证绕过

漏洞分析

服务器通过检查Content-Type头验证文件类型:

  • 图片文件:image/jpeg, image/png
  • PHP文件:text/phpapplication/x-php

绕过方法

  1. 上传PHP文件时拦截请求
  2. 修改Content-Typeimage/jpeg
  3. 放行请求

4. getimagesize验证绕过

服务器使用getimagesize()函数验证文件头是否为有效图像。

绕过方法一:添加图像文件头

  1. 创建包含PHP代码的文本文件:
    <?php phpinfo();?>
    
  2. 添加图像文件头(如GIF89)
  3. 修改扩展名为.jpg
  4. 上传并抓包,确保文件头存在

绕过方法二:图片马制作

  1. 使用命令将图片与PHP脚本合并:
    copy 1.png/b + phpinfo.php/a 2.png
    
  2. 上传生成的图片马

利用文件包含漏洞执行

即使上传成功,服务器默认将文件作为图片解析。需配合文件包含漏洞执行:

http://x.x.x.x/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2020/10/20/5936185f8e5245666f2586884965.jpg&submit=提交查询

防御措施

  1. 文件内容检查:使用文件头验证真实文件类型
  2. 重命名策略:使用随机字符串重命名上传文件
  3. 权限控制:上传目录禁止脚本执行
  4. 隔离存储:将上传文件存储在非Web目录
  5. 多层验证:结合前端+后端验证
  6. 文件类型白名单:严格限制允许的文件类型
  7. 日志监控:记录所有上传行为

实验环境搭建建议

  1. 使用Pikachu靶场练习
  2. 配置不同验证级别的上传页面:
    • 仅前端验证
    • MIME类型验证
    • getimagesize验证
  3. 准备各种绕过工具:
    • 浏览器开发者工具
    • Burp Suite等抓包工具
    • 十六进制编辑器
不安全的文件上传漏洞教学文档 1. 漏洞概述 文件上传功能在Web应用中非常常见(如头像上传、附件上传等)。当后台对上传文件的安全判断不足时,攻击者可能上传恶意文件(如Webshell),导致服务器被控制。 安全设计要点: 验证文件类型、后缀名、大小 验证文件上传方式 对文件进行复杂重命名 不暴露文件上传后的路径 2. 客户端检查绕过(Client Check) 漏洞分析 前端JavaScript验证文件扩展名: 绕过方法 禁用浏览器JavaScript: 火狐/Chrome浏览器禁用JS后可直接上传PHP文件 访问上传路径: 3. MIME类型验证绕过 漏洞分析 服务器通过检查 Content-Type 头验证文件类型: 图片文件: image/jpeg , image/png 等 PHP文件: text/php 或 application/x-php 绕过方法 上传PHP文件时拦截请求 修改 Content-Type 为 image/jpeg 放行请求 4. getimagesize验证绕过 服务器使用 getimagesize() 函数验证文件头是否为有效图像。 绕过方法一:添加图像文件头 创建包含PHP代码的文本文件: 添加图像文件头(如GIF89) 修改扩展名为.jpg 上传并抓包,确保文件头存在 绕过方法二:图片马制作 使用命令将图片与PHP脚本合并: 上传生成的图片马 利用文件包含漏洞执行 即使上传成功,服务器默认将文件作为图片解析。需配合文件包含漏洞执行: 防御措施 文件内容检查 :使用文件头验证真实文件类型 重命名策略 :使用随机字符串重命名上传文件 权限控制 :上传目录禁止脚本执行 隔离存储 :将上传文件存储在非Web目录 多层验证 :结合前端+后端验证 文件类型白名单 :严格限制允许的文件类型 日志监控 :记录所有上传行为 实验环境搭建建议 使用Pikachu靶场练习 配置不同验证级别的上传页面: 仅前端验证 MIME类型验证 getimagesize验证 准备各种绕过工具: 浏览器开发者工具 Burp Suite等抓包工具 十六进制编辑器