绕过服务端文件上传检测:黑名单绕过技术与实战

文件上传漏洞是Web安全中常见且危害极大的漏洞类型之一,而黑名单机制是最基础的防御手段。本文将深入探讨三种经典的黑名单绕过技术,并提供实战案例与防御方案。

引言

文件上传功能是现代Web应用的重要组成部分,但同时也是攻击者最常利用的攻击向量之一。当服务端采用黑名单机制来限制文件上传时,攻击者往往能找到巧妙的方法绕过这些限制,上传恶意文件(如Webshell)从而获取服务器控制权。

黑名单机制的局限性

黑名单机制通过禁止特定扩展名(如.php.asp.jsp)的文件上传来提供安全防护。然而,这种机制存在先天缺陷:它只能阻止已知的危险扩展名,无法防范未知或变种的攻击方式

黑名单绕过技术详解

1. 后缀大小写绕过

原理分析

当服务端使用简单的字符串匹配检测(如in_array()==比较),且未统一规范化文件扩展名时,攻击者可以通过改变扩展名的大小写来绕过检测。

漏洞代码示例
$blacklist = array('php', 'asp', 'jsp');
$extension = strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION));// 错误:未先转换为小写再比较
if (in_array($extension, $blacklist)) {die("危险文件类型!");
}
绕过方法
  • Webshell.Php
  • Webshell.PHp
  • Webshell.pHp
实战案例

某CMS系统仅检测小写扩展名,攻击者上传shell.PHP文件成功绕过检测,Apache服务器仍将其解析为PHP脚本。

2. 空格绕过

原理分析

在Windows环境中,文件名末尾的空格会被自动去除。如果服务端未对上传文件名进行去空处理,攻击者可利用此特性绕过检测。

漏洞代码示例
$filename = $_FILES['file']['name']; // 获取"shell.php "
$extension = pathinfo($filename, PATHINFO_EXTENSION); // 获取扩展名"php "if (in_array($extension, $blacklist)) {die("危险文件类型!");
}// Windows系统保存文件时会自动去除末尾空格,变成"shell.php"
move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/'.$filename);
绕过方法
  • shell.php (末尾加空格)
  • shell.php. (点号后加空格)
实战案例

某论坛使用简单黑名单检测,但未处理文件名空格。攻击者上传cmd.asp 文件,在Windows服务器上成功保存为cmd.asp并被IIS解析执行。

3. 点号绕过

原理分析

Windows系统会自动去除文件名末尾的点号(.),而许多黑名单检测逻辑未考虑这一特性。

漏洞代码示例
$filename = $_FILES['file']['name']; // 获取"shell.php."
$extension = pathinfo($filename, PATHINFO_EXTENSION); // 获取扩展名"php."if (in_array($extension, $blacklist)) { // 检测"php."不在黑名单中die("危险文件类型!");
}// Windows保存时自动去除末尾点号,变成"shell.php"
move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/'.$filename);
绕过方法
  • shell.php.
  • shell.asp.
实战案例

某企业OA系统在黑名单中禁止了PHP文件,但未处理末尾点号。攻击者上传admin.php.文件,在Windows服务器上成功保存为可执行的PHP文件。

综合利用与高级技巧

熟练的攻击者往往会组合使用多种技术:

  1. 组合payloadWebshell.PHp. (大小写+点号+空格)
  2. 双重扩展名shell.php.jpg(配合解析漏洞)
  3. 特殊字符shell.php%00.jpg(空字节截断,需特定环境)

防御方案

1. 使用白名单替代黑名单

$whitelist = array('jpg', 'png', 'gif', 'pdf');
$extension = strtolower(pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION));if (!in_array($extension, $whitelist)) {die("仅允许上传图片和PDF文件!");
}

2. 规范化文件名

// 去除首尾空格和点号
$filename = trim(basename($_FILES['file']['name']), " .");
$extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION));

3. 重命名上传文件

// 使用随机生成的文件名,避免保留用户输入
$new_filename = md5(uniqid().mt_rand()).'.'.$extension;
move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/'.$new_filename);

4. 综合防护措施

  • MIME类型验证:检查$_FILES['file']['type']
  • 文件内容检测:使用getimagesize()验证图片文件真实性
  • 服务器配置:禁用上传目录的脚本执行权限
  • 文件权限限制:设置上传文件为只读

结语

黑名单机制本质上是一种不安全的安全措施,容易被多种方法绕过。作为安全工程师,我们应该推荐使用白名单机制作为文件上传功能的基础防护,并结合多层次的安全检测和服务器配置,才能有效防御文件上传漏洞。

安全警示:本文技术仅用于安全研究和授权测试,未经授权的攻击行为是违法的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/93613.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/93613.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/93613.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在职老D渗透日记day21:sqli-labs靶场通关(第27a关)get联合注入 过滤select和union “闭合

5.27a.第27a关 get联合注入 过滤select和union "闭合function blacklist($id) { $id preg_replace(/[\/\*]/,"", $id); //strip out /* $id preg_replace(/[--]/,"", $id); //Strip out --. $id preg_replace(/[#]/,"", $id); //Strip …

Git#cherry-pick

场景 项目里有多个分支,在某个分支commit内容想要应用到当前分支 命令 git cherry-pick --helpgit cherry-pick commit-ish:某个其他分支的commit应用到当前所在分支 (默认自动提交)git cherry-pick -n commit-ish:–no-commit(不自动提交)&a…

极海APM32F107V6 gpio模拟串口

一、原理部分 之前用外设都是直接用的硬件自带的库,虽然以前有学过原理和时序,但是因为工作其实也很少会有需要gpio模拟串口的情况,但总会有串口用完,但是需要一个类似打印串口的情况。今天也是开整,然后用硬件的库对…

【数据可视化-94】2025 亚洲杯总决赛数据可视化分析:澳大利亚队 vs 中国队

🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

链表基本运算详解:查找、插入、删除及特殊链表

在上一篇文章中,我们介绍了线性表的基本概念和顺序存储。本文将深入探讨单链表的基本运算,并介绍循环链表和双向链表这两种特殊的链表结构,帮助读者全面掌握链表的操作技巧。 文章目录1.单链表基本运算链表的查找操作按序号查找按值查找链表的…

8.19作业

1.聊天室1.1服务器#include <myhead.h> #define SER_PORT 8888 #define SER_IP "192.168.174.128"struct msg {char type;char usrname[20];char msgtext[1024]; };int main(int argc, const char *argv[]) {int sfd socket(AF_INET,SOCK_STREAM,0);if (sfd-1…

95、23种设计模式之建造者模式(4/23)

建造者模式&#xff08;Builder Pattern&#xff09;是23种经典设计模式中的创建型模式之一&#xff0c;其核心思想是将复杂对象的构建过程与其表示分离&#xff0c;使得同样的构建流程可以生成不同结构或配置的对象。以下从定义、结构、应用场景、优缺点及代码示例展开分析&am…

LIA-X - 一张照片生成任意表情肖像动画视频 精准操控面部动作 支持50系显卡 一键整合包下载

LIA-X 是一个可解释的潜在肖像动画生成器&#xff0c;只需要一张照片加一段驱动视频生成任意表情肖像动画&#xff0c; 旨在将驱动视频中的面部动态精细地转移到源肖像上&#xff0c;同时提供对头部、嘴巴和眼睛的精细控制。同时支持图像和视频的编辑任务&#xff0c;比如对头部…

Google 的 Opal:重新定义自动化的 AI 平台

1. 真实世界测试&#xff1a;结果出乎意料 我让 Opal 接受了三项极具挑战性的任务&#xff1a; 1.1. 博客生成器挑战 我的提示&#xff1a;“研究并撰写一篇关于 2 亿美元融资对无代码&#xff08;no-code&#xff09;影响的文章。” 发生了什么&#xff1a;Opal 不仅仅是写…

【FreeRTOS】任务通知

任务通知通知状态的三种取值taskNOT_WAITING_NOTIFICATION&#xff1a;任务没有在等待通知taskWAITING_NOTIFICATION&#xff1a;任务在等待通知taskNOTIFICATION_RECEIVED&#xff1a;任务接收到了通知&#xff0c;也被称为 pending(有数据了&#xff0c;待处理)如下面两个场景…

BEV:隐式相机视角转换-----BEVFormer

一、背景 基于imp投影的相机视角转换&#xff0c;对相机的内外参依赖较高&#xff0c;BEV 网格融合固定&#xff0c;可能对小目标不够敏感&#xff1b;考虑通过transformer的方式进行相机的视角转换&#xff0c;BEV query 可以自适应关注关键区域&#xff0c;提高小目标检测&am…

zsh 使用笔记 命令行智能提示 bash智能

目录 安装&#xff1a; 升级&#xff1a; zsh 有什么用&#xff1f; zsh 安装&#xff1a; sudo apt update sudo apt install zsh -y 升级&#xff1a; omz update zsh 有什么用&#xff1f; 相比 bash&#xff0c;zsh 更智能、更方便&#xff0c;常见优势有&#xff…

Laya的适配模式选择

文章目录SCALE_FIXED_AUTOSCALE_SHOWALLSCALE_FULLSCALE_FIXED_HEIGHTSCALE_FIXED_WIDTHSCALE_NOSCALESCALE_EXACTFITSCALE_NOBORDERdemoSCALE_FIXED_AUTO NO.1会透&#xff0c;拉伸能解决官网解释&#xff1a;应用保持设计比例不变&#xff0c;全屏显示全部内容(类似showall&…

Android中flavor的使用

在我的开发中&#xff0c;有这样的需求&#xff0c;有一个项目&#xff0c;需要适配不同的执法仪设备&#xff0c;这些执法仪都是Android系统的&#xff0c;而且有的有系统签名&#xff0c;有的没有&#xff0c;比如我共有四款型号&#xff0c;有三款有系统签名&#xff0c;每款…

如何使用DeepSeek解析长pdf的文本

直接使用python工具解析pdf文件&#xff0c;可能因为格式兼容问题&#xff0c;导致解析出的文本几乎不可读。 这里尝试使用Deepseek解析pdf文件&#xff0c;这里仅考虑文本&#xff0c;不考虑其他要素。 1 解析第一步 将pdf作为附件上传到deepseekchat界面&#xff0c;输入如…

W3C CSS 活动

W3C CSS 活动 引言 CSS(层叠样式表)是现代网页设计中不可或缺的技术之一。W3C(万维网联盟)作为全球互联网标准制定的主要组织,定期举办各类CSS相关的活动,旨在促进CSS技术的发展与普及。本文将详细介绍W3C CSS活动,包括活动内容、参与方式以及活动意义。 活动内容 1…

React Native 与 UniApp 对比

React Native 优点: 由 Facebook 开发维护&#xff0c;社区生态强大 使用 JavaScript/TypeScript 开发&#xff0c;学习曲线相对平缓 真正的原生渲染&#xff0c;性能接近原生应用 支持热重载&#xff0c;开发效率高 可访问所有原生平台 API 大型应用案例丰富(如 Faceboo…

Dijkstra和多层图 0

众所周知&#xff0c;Dijkstra经常拿来解决不带负权和环的单元最短路。我们先来看一下他的实现过程 (由于朴素版用的不多&#xff0c;我们直接上堆优化) 模板 #include<bits/stdc.h> #define mf(x,y) make_pair(x,y)//x距离&#xff0c;y节点 using namespace std; …

【驱动】RK3576:桌面操作系统基本概念

1、桌面操作系统 我们常说的Ubuntu、Debian、麒麟、统信等都是总包工头; 他们把linux内核、根文件系统(遵循 Linux 标准文件系统层次结构FHS)、包管理(软件、库)、桌面环境(GNOME、Xfce等)、初始化系统(Systemd)、各种服务与守护进程、安全组件等整合成一个完整的桌面…

sfc_os!SfcQueueValidationRequest函数分析之sfc_os!IsFileInQueue

第一部分&#xff1a;1: kd> kc# 00 sfc_os!SfcQueueValidationRequest 01 sfc_os!SfcWatchProtectedDirectoriesWorkerThread 02 kernel32!BaseThreadStart1: kd> dvRegVal 0x01129164ChangeType 5vrd 0x012bfef0Status 0n1988337684vrdexisting 0x012bffdc//// if…