当前位置: 首页 > news >正文

No.23 笔记 | WEB安全 - 任意文件漏洞 part 5

本文全面且深入地探讨了文件上传漏洞相关知识。从基础概念出发,清晰地阐述了文件上传漏洞的定义及其产生的本质原因,同时列出了该漏洞成立的必要条件。详细说明了文件上传漏洞可能对服务器控制权、网站安全以及业务运营带来的严重危害。
文中还深入解析了前端验证与服务器端验证机制,包括具体的验证方法与代码示例。进一步介绍了常见的绕过技术和高级攻击手段,如条件竞争、二次渲染绕过等,并针对这些攻击给出了切实可行的防护建议。
最后,通过将文件上传过程类比为快递公司处理包裹,以形象生动的方式解释了防护措施的重要性,包括多重检查、隔离存储等,是网络安全从业者和相关技术人员防范文件上传漏洞的重要参考资料。

1. 基础概念

1.1 什么是文件上传漏洞?

  • 定义:由于服务器端对上传文件的验证不严格,导致攻击者可以上传恶意文件并执行
  • 本质:服务器端安全控制不足的问题

1.2 漏洞成立的必要条件

  1. 服务器存在文件上传功能
  2. 验证机制存在缺陷
  3. 上传的文件能被解析执行
  4. 攻击者可以访问上传的文件

2. 漏洞危害

2.1 服务器控制权沦陷

  • 执行任意命令
  • 获取系统权限
  • 访问敏感信息
  • 控制数据库

2.2 网站安全威胁

  • 篡改网站内容
  • 植入恶意代码
  • 传播木马病毒
  • 构建后门程序

2.3 业务影响

  • 服务中断
  • 数据泄露
  • 财务损失
  • 声誉受损

3. 验证机制详解

3.1 前端验证

JavaScript验证

// 常见的前端验证代码示例 
function checkFile(file) { // 检查文件类型 if (!file.type.match('image.*')) { alert('只能上传图片文件!'); return false; } // 检查文件大小 if (file.size > 5242880) { alert('文件不能大于5MB!'); return false; } return true; 
} 

3.2 服务器端验证

1. 文件扩展名验证

  • 黑名单方式:
$blacklist = array('php', 'php3', 'php4', 'php5', 'phtml', 
'pht', 'jsp', 'jspa', 'jspx', 'asp', 'aspx', 'asa', 'cer', 
'cdx'); 
  • 白名单方式:
$whitelist = array('jpg', 'jpeg', 'png', 'gif'); 

2. MIME类型验证

// MIME类型检查示例 
$allowed_types = array('image/jpeg', 'image/png', 'image/gif'); 
if (!in_array($_FILES['upload']['type'], $allowed_types)) { die('不允许的文件类型'); 
} 

3. 文件内容验证

// 检查文件头部特征 
$image_info = getimagesize($_FILES['upload']['tmp_name']); 
if ($image_info === false) { die('非法的图片文件'); 
} 

4. 常见绕过技术

4.1 前端绕过
  • 禁用 JavaScript。
  • 使用抓包工具(如 Burp Suite)。
  • 直接构造 POST 请求。
4.2 扩展名绕过
  • 大小写变换:.pHp,.PhP,.PHP。
  • 特殊扩展名:.php3,.php4,.php5,.phtml。
  • 双扩展名:test.jpg.php,test.php.jpg。
4.3 MIME 类型绕过
  • 修改 Content - Type 头。
  • 常见图片 MIME 类型:image/jpeg,image/png,image/gif。

5. 高级攻击技术

5.1 条件竞争

攻击原理

  1. 上传合法文件
  2. 在验证过程中快速替换为恶意文件
  3. 利用时间差完成攻击

防护建议

  • 使用原子操作
  • 加锁机制
  • 临时文件处理

5.2 二次渲染绕过

常见技术

  1. 图片马制作
  2. 绕过二次渲染
  3. 保持payload完整性

6. 防护措施

6.1 基本防护

  1. 完善的文件验证
  2. 文件重命名
  3. 限制文件大小
  4. 设置上传目录权限

6.2 进阶防护

  1. 使用Web应用防火墙(WAF)
  2. 实施文件隔离
  3. 采用CDN存储
  4. 定期安全扫描

6.3 最佳实践

  1. 采用白名单验证
  2. 多重验证机制
  3. 文件存储分离
  4. 权限最小化原则

文件上传漏洞:一个快递包裹的故事 📦

想象你正在经营一家快递公司。你的工作就是接收包裹并送到目的地。这就像网站接收用户上传的文件一样。

1. 为什么会有危险?🤔

想象一下:

  • 如果有人寄了一个装有炸弹的包裹,但外表看起来很普通
  • 快递员没仔细检查就收下了
  • 结果包裹送到目的地后造成了破坏

这就是文件上传漏洞的本质:

  • 攻击者上传看似普通但实际包含恶意代码的文件
  • 服务器没有严格检查就接收并执行了这些文件
  • 结果服务器被攻击者控制了

2. 现实生活中的例子 🌟

场景一:照片上传

假设你在社交网站上传头像:

实际操作: 
1. 选择一张可爱猫咪照片 
2. 点击上传按钮 
3. 网站显示你的新头像 

但黑客可能会:

黑客操作: 
1. 准备一个"照片.php"文件 
2. 文件看起来是张照片 
3. 实际内容是能控制服务器的代码 

3. 防护措施:安检系统 🔍

就像机场安检一样,文件上传也需要多重检查:

第一道防线:前台检查

// 就像安检员问你:"你的包裹里是什么?" 
if (文件类型 != 图片) { 拒绝接收(); } 

第二道防线:后台深度检查

// 像X光机扫描包裹 
检查文件实际内容(); 检查文件类型(); 检查文件大小(); 

4. 实际攻击案例解析 🎯

案例:图片马

想象你收到一个"特殊"的明信片:

  • 表面看:是张普通的风景照
  • 实际上:照片里藏着一串密码

5. 防护建议:像安保系统一样 🛡️

  1. 多重检查
  • 门卫检查(前端)
  • 安检仪(MIME类型)
  • 开箱检查(内容分析)
  1. 隔离存储
  • 就像危险品要单独存放
  • 上传文件放在特殊目录
  • 限制文件执行权限

6. 实战演示:快递验收流程 📝

正常流程:

  1. 查看包裹外观(文件扩展名)
  2. 过X光机(文件内容检查)
  3. 确认收件人(权限验证)
  4. 放入对应仓库(存储隔离)

攻击者可能的绕过方式:

  1. 虚假标签(改扩展名)
  2. 夹带私货(隐藏代码)
  3. 趁人不备(条件竞争)

7. 关键防护点 🔐

想象你是一个严格的安检员:

  1. 白名单制度
  • 只收特定类型的包裹
  • 比如只允许jpg、png格式
  1. 深度检查
  • 不光看外表
  • 还要检查内部内容
  1. 隔离存储
  • 危险品专门存放
  • 普通物品单独存放

8. 实用小贴士 💡

永远不信任用户输入

就像不轻易相信陌生人的包裹

使用多重验证

就像重要物品需要多重确认

定期检查系统

就像定期安全演习

相关文章:

No.23 笔记 | WEB安全 - 任意文件漏洞 part 5

本文全面且深入地探讨了文件上传漏洞相关知识。从基础概念出发,清晰地阐述了文件上传漏洞的定义及其产生的本质原因,同时列出了该漏洞成立的必要条件。详细说明了文件上传漏洞可能对服务器控制权、网站安全以及业务运营带来的严重危害。 文中还深入解析了…...

EasyPlayer.js网页播放器,支持FLV、HLS、WebSocket、WebRTC、H.264/H.265、MP4、ts各种音视频流播放

EasyPlayer.js功能: 1、支持解码H.264视频(Baseline, Main, High Profile全支持,支持解码B帧视频) 2、支持解码H.265视频(flv id 12) 3、支持解码AAC音频(LC,HE,HEv2 Profile全支持) 4、支持解码MP3音频以及Speex音频格式 5、可…...

WPF数据绑定的五大模式

WPF(Windows Presentation Foundation)是微软推出的一种用于构建Windows用户界面的UI框架。它支持数据绑定,允许开发者将UI元素与数据源绑定,从而实现数据和界面的自动同步。WPF数据绑定有几种不同的模式, 以下是五种…...

从零到一:大学新生编程入门攻略与成长指南

文章目录 每日一句正能量前言编程语言选择:为大学新生量身定制Python:简单而强大的选择JavaScript:Web开发的基石Java:面向对象的经典C#:微软的全能选手 学习资源推荐:编程学习的宝藏在线课程教程和文档书籍…...

详细分析Pytorch中的transpose基本知识(附Demo)| 对比 permute

目录 前言1. 基本知识2. Demo 前言 原先的permute推荐阅读:详细分析Pytorch中的permute基本知识(附Demo) 1. 基本知识 transpose 是 PyTorch 中用于交换张量维度的函数,特别是用于二维张量(矩阵)的转置操…...

初识WebGL

思路&#xff1a; 构建<canvas>画布节点&#xff0c;获取其的实例。使用getWebGLContext() 拿到画布上下文。拿到上下文用clearColor() 设置背景颜色。最后清空canvas画布,是为了清除颜色缓冲区。 html结构&#xff1a; <!DOCTYPE html> <html lang"en&…...

【力扣】Go语言回溯算法详细实现与方法论提炼

文章目录 一、引言二、回溯算法的核心概念三、组合问题1. LeetCode 77. 组合2. LeetCode 216. 组合总和III3. LeetCode 17. 电话号码的字母组合4. LeetCode 39. 组合总和5. LeetCode 40. 组合总和 II小结 四、分割问题6. LeetCode 131. 分割回文串7. LeetCode 93. 复原IP地址小…...

「C/C++」C/C++ 之 第三方库使用规范

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…...

六、元素应用CSS的习题

题目一&#xff1a; 使用CSS样式对页面元素加以修饰&#xff0c;制作“ 旅游攻略 ”网站。如下图所示 运行效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8" /><title>旅游攻略</title><…...

正式入驻!上海斯歌BPM PaaS管理软件等产品入选华为云联营商品

近日&#xff0c;上海斯歌旗下BPM PaaS管理软件&#xff08;NBS&#xff09;等多款产品入选华为云云商店联营商品&#xff0c;上海斯歌正式成为华为云联营商品合作伙伴。用户登录华为云云商店即可采购上海斯歌的BPM PaaS产品及配套服务。通过联营模式&#xff0c;双方合作能够深…...

使用 Axios 上传大文件分片上传

背景 在上传大文件时&#xff0c;分片上传是一种常见且有效的策略。由于大文件在上传过程中可能会遇到内存溢出、网络不稳定等问题&#xff0c;分片上传可以显著提高上传的可靠性和效率。通过将大文件分割成多个小分片&#xff0c;不仅可以减少单次上传的数据量&#xff0c;降…...

Nginx+Lua脚本+Redis 实现自动封禁访问频率过高IP

1 、安装OpenResty 安装使用 OpenResty&#xff0c;这是一个集成了各种 Lua 模块的 Nginx 服务器&#xff0c;是一个以Nginx为核心同时包含很多第三方模块的Web应用服务器&#xff0c;使用Nginx的同时又能使用lua等模块实现复杂的控制。 &#xff08;1&#xff09;安装编译工具…...

PART 1 数据挖掘概论 — 数据挖掘方法论

目录 数据库知识发掘步骤 数据挖掘技术的产业标准 CRISP-DM SEMMA 数据库知识发掘步骤 数据库知识发掘(Knowledge Discovery in Database,KDD)是从数据库中的大量数据中发现不明显、之前未知、可能有用的知识。 知识发掘流程(Knowledge Discovery Process)包括属性选择…...

Centos安装ffmpeg的方法

推荐第一个,不要自己编译安装,太难了,坑多。 在 CentOS 上安装 FFmpeg 有几种方法,以下是两种常见的方法: ### 方法一:使用 RPM Fusion 仓库安装 1. **启用 RPM Fusion 仓库**: RPM Fusion 是一个第三方仓库,提供了许多 CentOS 官方仓库中没有的软件包。 ```bash…...

理解SQL中通配符的使用

前言 SQL 是一种标准化的结构化查询语言&#xff0c;涉及结构化查询时&#xff0c;高效地检索数据至关重要。而通配符是SQL中模式匹配的有效的方法。使用通配符可以更轻松地检索到所需的确切数据。通配符允许我们定义多功能查询条件。本文将 介绍SQL通配符的基础知识及用法。 …...

SpringBoot篇(简化操作的原理)

目录 一、代码位置 二、统一版本管理&#xff08;parent&#xff09; 三、提供 starter简化 Maven 配置 四、自动配置 Spring&#xff08;引导类&#xff09; 五、嵌入式 servlet 容器 一、代码位置 二、统一版本管理&#xff08;parent&#xff09; SpringBoot项目都会继…...

Cesium的模型(ModelVS)顶点着色器浅析

来自glTF和3D Tiles的模型会走ModelVS.glsl。这个文件不单独是把模型顶点转换为屏幕坐标&#xff0c;还包含了丰富的处理过程。 Cesium是根据定义的Define判断某个行为是否需要被执行&#xff0c;比如#define HAS_SILHOUETTE&#xff0c;说明需要计算模型外轮廓线。 Cesium的…...

机器人领域中的scaling law:通过复现斯坦福机器人UMI——探讨数据规模化定律(含UMI的复现关键)

前言 在24年10.26/10.27两天&#xff0c;我司七月在线举办的七月大模型机器人线下营时&#xff0c;我们带着大家一步步复现UMI&#xff0c;比如把杯子摆到杯盘上(其中1-2位学员朋友还亲自自身成功做到该任务) 此外&#xff0c;我还特地邀请了针对UMI做了改进工作的fastumi作者…...

C++之多态的深度剖析

目录 前言 1.多态的概念 2.多态的定义及实现 2.1多态的构成条件 2.1.1重要条件 2.1.2 虚函数 2.1.3 虚函数的重写/覆盖 2.1.4 选择题 2.1.5 虚函数其他知识 协变&#xff08;了解&#xff09; 析构函数的重写 override 和 final关键字 3. 重载&#xff0c;重写&…...

Microsoft Office PowerPoint制作科研论文用图

Microsoft Office PowerPoint制作科研论文用图 1. 获取高清图片2. 导入PPT3. 另存为“增强型windows元文件”emf格式4. 画图剪裁 1. 获取高清图片 这里指通过绘图软件画分辨率高的图片&#xff0c;我一般使用python画dpi600的图片。 2. 导入PPT 新建一个PPT&#xff08;注意&a…...

go语言进阶之并发基础

并发 什么是并发&#xff0c;也就是我们常说的多线程&#xff0c;多个程序同时执行。 并发的基础 线程和进程 进程 进程是操作系统中一个重要的概念&#xff0c;指的是一个正在运行的程序的实例。它包含程序代码、当前活动的状态、变量、程序计数器和内存等资源。进程是系…...

po、dto、vo的使用场景

现在项目中有两类模型类&#xff1a;DTO数据传输对象、PO持久化对象&#xff0c;DTO用于接口层向业务层之间传输数据&#xff0c;PO用于业务层与持久层之间传输数据&#xff0c;有些项目还会设置VO对象&#xff0c;VO对象用在前端与接口层之间传输数据&#xff0c;如下图&#…...

聊一聊Elasticsearch的一些基本信息

一、Elasticsearch是什么 Elasticsearch简称ES&#xff0c;是一款分布式搜索引擎。它是在Apache Lucene基础之上采用Java语言开发的。 Elasticsearch的官方网站对它的解释是&#xff1a;Elasticsearch是一个分布式、RESTful的搜索和数据分析引擎。 通过上边的官方解释&#…...

Unity 两篇文章熟悉所有编辑器拓展关键类 (上)

本专栏基础资源来自唐老狮和siki学院&#xff0c;仅作学习交流使用&#xff0c;不作任何商业用途&#xff0c;吃水不忘打井人&#xff0c;谨遵教诲 编辑器扩展内容实在是太多太多了&#xff08;本篇就有五千字&#xff09; 所以分为两个篇章而且只用一些常用api举例&#xff0c…...

Spring SPI、Solon SPI 有点儿像(Maven 与 Gradle)

一、什么是 SPI SPI 全名 Service Provider interface&#xff0c;翻译过来就是“服务提供接口”。基本效果是&#xff0c;申明一个接口&#xff0c;然后通过配置获取它的实现&#xff0c;进而实现动态扩展。 Java SPI 是 JDK 内置的一种动态加载扩展点的实现。 一般的业务代…...

合并排序算法(C语言版)

#include <stdio.h> void Copy(int *a, int *b, int left, int right) { int i; for(i0;i<right-left1;i) { a[ileft] b[i]; } } // 将 a[left,middle] 和 a[middle1,right]合并到 b[left, right]中 void Merge(int *a, int left, int midd…...

C++——输入一行文字,找出其中的大写字母、小写字母、空格数字以及其他字符各有多少。用指针或引用方法处理。

没注释的源代码 #include <iostream> using namespace std; int main() { char c; int ul0,ll0,sp0,di0,other0; cout<<"please input script c:"; while(cin.get(c)) { if(c\n) break; else if(c>A&&…...

【skywalking】maximum query complexity exceeded 3336 > 3000

问题 skywalking相关版本信息 jdk&#xff1a;17skywalking&#xff1a;10.1.0apache-skywalking-java-agent&#xff1a;9.3.0ElasticSearch : 8.8.2 问题描述 maximum query complexity exceeded 3336 > 3000 最大查询复杂度超过3336>3000 可能原因 查询条件过于复…...

开源一个开发的聊天应用与AI开发框架,集成 ChatGPT,支持私有部署的源码

大家好&#xff0c;我是一颗甜苞谷&#xff0c;今天分享一个开发的聊天应用与AI开发框架&#xff0c;集成 ChatGPT&#xff0c;支持私有部署的源码。 介绍 当前系统集成了ChatGPT的聊天应用&#xff0c;不仅提供了基本的即时通讯功能&#xff0c;还引入了先进的AI技术&#x…...

开发了一个成人学位英语助考微信小程序

微信小程序名称&#xff1a;石榴英语 全称&#xff1a;石榴英语真题助手 功能定位 北京成人学士学位英语辅助学习工具&#xff0c;包含记高频单词&#xff0c;高频词组&#xff0c;专项练习&#xff0c;模拟考试等功能。 开发背景 个人工作需要提高学习英文水平&#xff…...

永久免费素材网站/新app推广去哪里找

刚刚接触SpringBoot&#xff0c;说说踩过的坑&#xff0c;主要的还是要记录下来&#xff0c;供以后反省反省&#xff01; 今天主要讲讲 thymeleafsecurity 的搭建&#xff0c;SpringBoot的项目搭建应该比较简单&#xff0c;这里就不多说了。可以去网上找到很多。 一&#xff1a…...

上海网站推广很好/成人职业技能培训学校

做为系统管理员可能会面对的任务:1.自动批量安装操作系统2.完成系统的本地化 (配置现成的发行版或者软件包,以求符合自己的需要,本地安全规定、文 件存放和网络拓扑的需要&#xff0c;这个过程称为“本地化”)3.给系统打补丁且保持系统的更新 4.管理附加的软件包 程…...

做网站要注意的/seo优化外包公司

1.LocationManagerProxy 获取当前Context 创建一个LocationManagerProxy 变量 mAMapLocManager LocationManagerProxy.getInstance(this); 2.mAMapLocManager.requestLocationUpdates(LocationProviderProxy.AMapNetwork, 5000, 10, this); //设定 精度 5000m 监听器为当…...

vs做网站需要的插件/广东河源最新疫情

echarts去掉makeline线的箭头 markLine : {symbol:none,//去掉箭头itemStyle: {normal: {lineStyle: {color: #008ACD,type: dotted},label:{formatter:}}},data : [<?php echo $shuxianStr;?>]}, The End转载于:https://blog.51cto.com/xuqin/2312250...

网站设计与建设ppt/官网seo是什么

前段时间在折腾如何通过 SD-WAN 组网方式打通办公室和家里的异地局域网。需要用到路由器的静态路由表功能&#xff0c;但是遍历整个家用路由器市场几乎没有支持这个功能的路由器&#xff08;只有华硕 RT-AX57 有这个功能&#xff0c;但是成本超出了我的预算&#xff09;。所有就…...

asp源码网站/图片优化网站

1.列表生成式 # 单层循环: 生成一个列表,列表元素为[1*1,2*2...9*9] print([i*i for i in range(1,10)])输出结果如下: [1, 4, 9, 16, 25, 36, 49, 64, 81]# 多层循环: print([ ij for i in ABC for j in XYZ])输出结果如下: [AX, AY, AZ, BX, BY, BZ, CX, CY, CZ]# 循环判断语…...