网络安全之文件上传漏洞
一,文件上传漏洞的原因:
文件上传漏洞的存在主要是因为开发者未对用户上传的文件进行充分的安全验证,导致攻击者可以上传恶意文件(如 WebShell、恶意脚本等)到服务器,进而控制服务器或实施进一步攻击。
常见的成因有: 未验证文件类型和扩展名,未检测文件内容,未限制文件路径和权限,依赖黑名单而非白名单,服务器解析漏洞
常见的场景有:用户头像上传(允许用户上传头像,但未校验文件类型。),文档或图片分享平台(允许上传 PDF、图片等文件,但未检测文件内容。),CMS 或插件漏洞(内容管理系统(如 WordPress、Joomla)的插件存在上传逻辑缺陷。),API 文件上传接口(后端 API 接收文件时,未对来源和内容进行校验。),压缩包解压漏洞(允许上传 ZIP 压缩包并自动解压,未检查压缩包内文件。)
---------------------------------------------------------------------------------------------------------------------------------
二,案例分析
第一篇:upload-labs靶场(1-21关)
pass01(只使用javascrip过滤)
分析:只使用了JavaScript过滤,直接关掉浏览器的Javascrip功能,或者burp抓包修改文件后缀即可

操作如下:
第一种:禁用JavaScript

可以看到直接上传成功

第二种方法,使用工具(如burp),修改文件后缀,Javascrip只检测了前端的后缀,可以修改发送到服务器的包


pass02(服务端对content-type的限制)
分析:只对content-type进行白名单的限制,几乎没有用,照样发送php文件,用burp抓包,修改content-type进行send即可

方法:上传php文件,并用burp修改content-type内容

pass03(黑名单过滤不全)
某些特定的后缀仍会被php解析:如php、php2、php3、php4、php5、php6、php7、pht、phtm、phtml。

用phtml后缀名试一下

pass04(apache早期版本,.htaccess服务配置文件未过滤)

上传.htaccess文件,内容如下,可以将demo.png解析成php,将demo.phg改后缀上传即可
<FilesMatch "demo.png">
SetHandler application/x-httpd-php
</FilesMatch>
pass05(黑名单过滤少了ini)

user.ini和.htaccess一样是目录的配置文件,.user.ini就是用户自定义的php.ini(全局配置文件)
.user.ini 配置项中有两个配置可以起到一些作用
方法一:
auto_prepend_file = <filename> //包含在文件头
方法二:
auto_append_file = <filename> //包含在文件尾
pass06(无大小写过滤)

windows中对大小写不敏感

pass07(Windows文件后缀未去空)
可以看到和上之前的代码相比,过滤函数少了一个trim()函数去空操作

做法:只需要用burp抓包,改文件后缀添加一个空格即可

pass08(windows文件后缀未去点)
如果上传的是tp.php. strrchr($file_name,".")的返回结果并不是 . 而是.php.
跟之前的代码相比,少了去除文件后缀末尾的.操作,在windows中仍然会识别

做法,使用burp抓包,改掉文件后缀添加.

pass09(windows中文件后缀未去::data)
跟之前的代码相比,少了去::$DATA操作

做法,正常上传文件,用burp抓包,改掉文件后缀添加::$DATA

pass10(后缀过滤考虑不周,仍可以通过一些方式绕过过滤)
看似都过滤了很安全,实则不然,

抓包上传后缀名为.php. .的文件

pass11(双写绕过,或大小写绕过)

直接burp抓包改后缀

pass12(使用$GET("save_path")来自定义保存路径,可以使用%00截断)
在c语言中%00代表阶段,如果我们正常上传正确的文件类型,然后修改save_path的路径如:目录/web.php%00, 在文件上传路径拼接的时候,后面的路径就被截断了,而他在前面已经进行了白名单过滤
%00截断常在url中get请求使用,在url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束。所以一般文件上传绕过%00会在路径上使用
使用条件:
php版本<5.3.29
php.ini配置文件中magic_quotes_gpc = Off

直接上burp抓包,修改save_path路径

pass13($POST(保存路径),使用16进制00截断)
转16进制,将路径后面修改成00截断

这里可以看到保存路径后的php后缀多了一个\0截断

pass14(文件包含,检测图片前面的内容)
这关是文件包含漏洞的关卡,文件包含漏洞是指未正确使用include()函数,在进行文件包含的同时,仍然会用php解释器执行图片的二进制内容,这时候可以将php恶意代码嵌入到图片中

这里可以看到,本关卡对上传的图片进行了前面的内容检测,可以将php代码嵌入到图片尾部

存在文件包含漏洞,直接打开这个网址,给除上传的图片码的file地址变量。
第一步,制作图片码:

第二步,上传文件,并复制文件地址

第三步,点击文件包含漏洞,给出参数?file="复制的文件地址路径",结果如下,在include()时执行了图片码中的php代码

pass15(由于 getimagesize() 只读取文件头信息,恶意代码可能被忽略)
getimagesize()仍然只检测文件头信息,上传pass14的图片码仍然可以成功

做法与pass14一致,结果如下

pass16(exif_imagetype()仍然是通过文件头来检测文件类型)
查看源代码需要php开启exif扩展才生效

开启扩展过后步骤与前面两关一致,制作图片码,上传,用文件包含漏洞进行上传的文件包含,执行图片码中的php代码。

pass17(进行了图片的二次渲染)
这里可以看到,使用了imagecreatefromjpeg()函数,对上传的图片进行打乱,生成新的图片,可以正常上传图片,用010editor工具查看上传前后不变的区域,在那里插入php代码

先正常上传一个文件,然后将上传后二次渲染的文件下载下来,用010editor软件打开,在工具选项---比较文件功能,比较两个文件的16进制,找出前后不变的片段,插入php代码


保存图片,将新构成的图片码上传,后续步骤与上面的关卡一致,进行文件包含,给file参数值

pass18(先上传了文件,再判断是否在白名单里面,存在竞争)
从代码来看,这个页面是先将文件上传了过后,再判断文件的后缀是否在白名单里面,我可以不断的发包上传php(该php代码可以是在上级创建一个的恶意文件代码的php文件)文件,再不断访问文件包含漏洞的界面进行该图片的文件包含,总有一刻是我上传了文件,进行了文件包含,才判断我的文件是否在白名单中,这样已经为时已晚了

修改php代码,这个代码是在上级目录创建一个名未shell.php文件,内容是<?php phpinfo(); ?>

直接上传,用burp抓包,再用intruder模块自动化攻击,持续发上传文件的包


在访问文件包含漏洞的界面,持续刷新
---------------------------------------------------------------------------------------------------------------------------------
相关文章:
网络安全之文件上传漏洞
一,文件上传漏洞的原因: 文件上传漏洞的存在主要是因为开发者未对用户上传的文件进行充分的安全验证,导致攻击者可以上传恶意文件(如 WebShell、恶意脚本等)到服务器,进而控制服务器或实施进一步攻击。 常…...
Fast DDS Security--仿问控制
Fast DDS中提供了两种级别的仿问控制: 1 Domain Governance: 定义域级别的安全策略(全局规则). 2 DomainParticipant Permissions : 定义参与者的具体权限(个体规则) 先说一下Domain Governance…...
【13】单片机编程核心技巧:乘法运算
【13】单片机编程核心技巧:乘法运算 七律 乘法 乘法运算寄存间,溢出玄机隐字边。 连乘自增简写妙,移位替代速如仙。 中间变量扩疆土,长整型存避险关。 单片机中精算术,毫厘不爽展奇观。 摘要 乘法运算是单片机编程…...
为什么大模型网站使用 SSE 而不是 WebSocket?
在大模型网站(如 ChatGPT、Claude、Gemini 等)中,前端通常使用 EventSource(Server-Sent Events, SSE) 来与后端对接,而不是 WebSocket。这是因为 SSE 更适合类似流式文本生成的场景。下面我们详细对比 SSE…...
PostgreSQL的备份方式
PostgreSQL 提供多种方式进行备份,适用于不同需求的场景。常用的备份方法如下: 1. 逻辑备份(pg_dump 和 pg_dumpall) 1.1 使用 pg_dump 备份单个数据库 pg_dump 是 PostgreSQL 内置的逻辑备份工具,可以将数据库导出为…...
iTextSharp-PDF批量导出
HTML转PDF批量导出速度太慢且使用Spire.pdf.dll限制页签10后需要开通会员才能使用-做出优化 环境:U9 - UI插件 需求:选择需要导出的客户查询对应对账数据批量导出PDF并弹出下载框保存到默认位置 using System; using System.Collections.Generic; us…...
基于Matlab设计GUI图像处理交互界面
Image-Processing-GUI 项目说明 本博文提供了完整的代码和使用教程,适合新入门的朋友参考,完整代码资源文件请转至文末的下载链接。 本项目是《Matlab实践》中图像处理软件题目,本项目实现的具体内容如下 基于Matlab设计GUI交互界面图像的…...
osg安装编译第三方,完整详细过程。 libtiff/tif config.vc.hdoes not exist
第三方安装包下载地址 GitHub - bjornblissing/osg-3rdparty-cmake: CMake scripts for building OpenSceneGraph third party libraries. 在计算机中的布局 D:\CPlus\osg\src\osg-3rdparty\osg-3rdparty-cmake三层布局,src 放置源码 执行里面的批处理文件&#…...
红队OPSEC(安全运营)个人总结
OPSEC又称:运营安全,是指在红队的视角下,蓝队对我方的威胁。 OPSEC漏洞的五个流程: 关键信息识别:指红队的关键信息不泄露,包括但不限于红队的攻击意图,能力,人员,活动及…...
RSA算法:开启现代密码学的数学之钥
一、RSA算法简介 RSA(Rivest-Shamir-Adleman)是当今应用最广泛的非对称加密算法,由三位科学家Ron Rivest、Adi Shamir和Leonard Adleman于1977年提出。它的核心思想是利用数论中的难题,构建一对数学上关联的密钥——公钥用于加密…...
【从0到1构建实时聊天系统:Spring Boot + Vue3 + WebSocket全栈实战】
一、项目架构 技术栈清单: 后端:Spring Boot 3.0 WebSocket STOMP前端:Vue3 Pinia WebSocket Client部署:Nginx Docker Compose 二、核心功能实现 1. WebSocket双向通信 // 后端配置类 Configuration EnableWebSocketMes…...
HTML 超链接(简单易懂较详细)
在 HTML 中,超链接是通过 <a> 标签(anchor tag)创建的。超链接允许用户通过点击文本、图像或其他元素跳转到另一个网页、文件或页面的特定部分。本文将详细介绍 HTML 超链接的语法、属性和应用场景。 一、基本语法 <a href"U…...
《Android应用性能优化全解析:常见问题与解决方案》
目录 一、UI卡顿/掉帧 二、内存泄漏(Memory Leak) 三、ANR(Application Not Responding) 四、列表滑动卡顿(RecyclerView/ListView) 五、冷启动耗时过长 六、内存抖动(Memory Churn&#x…...
常见HTTP 状态码及意义
HTTP状态码是服务器响应客户端请求时返回的三位数字代码,它们分为五个类别,每个类别代表不同类型的响应。 1xx - 信息性状态码 这些状态码表示请求已被接收,继续处理。 100 Continue: 客户端应继续其请求。这个临时响应用于通知客户端&…...
Android Compose Surface 完全指南:从入门到花式操作
今天咱们来聊聊 Compose 世界里那个既基础又强大的组件——Surface。这个看似简单的矩形区域,实际藏着不少宝藏玩法,准备好你的 IDE,咱们发车! 一、Surface 是什么? 简单说,Surface 就是个自带背景和样式…...
Deepin通过二进制方式升级部署高版本 Docker
一、背景: 在Deepin系统中通过二进制方式升级部署高版本 Docker,下面将详细介绍二进制方式升级部署高版本 Docker 的具体步骤。 二、操作步骤 1.根据需求下载二进制文件,下载地址如下: https://mirrors.tuna.tsinghua.e…...
python中time模块的常用方法及应用
Python 的 time 模块是自带的标准模块,不需要额外安装,可以直接通过import time的方式导入并使用其中的函数和类。该模块提供了与时间相关的各种功能,以下是一些常用方法及其应用场景和示例: ### 1. time.time() - **功能**&…...
【RTSP】客户端(一):RTSP协议实现
概述 RTSP主要功能总结 RTSP本质是一个应用层协议,主要用于控制实时数据的传递,例如音视频流。RTSP的传输方式与HTTP类似,与HTTP不同在于RTSP主要用于控制传输媒体服务器上的流媒体会话。所以其是一个 客户端-服务器模型,客户端需…...
SpringBoot(一)--搭建架构5种方法
目录 一、⭐Idea从spring官网下载打开 2021版本idea 1.打开创建项目 2.修改pom.xml文件里的版本号 2017版本idea 二、从spring官网下载再用idea打开 三、Idea从阿里云的官网下载打开 编辑 四、Maven项目改造成springboot项目 五、从阿里云官网下载再用idea打开 Spri…...
面试之《commonjs,requirejs和es6 Module的区别》
设计理念 CommonJS:是为服务器端环境设计的模块化规范,以同步加载模块为核心思想。服务器端读取文件速度快,同步加载不会造成明显性能问题,方便开发者在代码执行前就确定模块间的依赖关系,便于管理和维护。RequireJS&…...
【工控】线扫相机小结 第五篇
背景介绍 线扫相机通过光栅尺的脉冲触发, 我在调试线扫过程中,发现图像被拉伸,预设调节分配器。图像正常后,我提高的相机的扫描速度(Y轴动的更快了)。 动的更快的发现,图像变短了(以…...
【STM32F103C8T6】DMA数据转运ADC多通道
前言 本节为代码部分,知识点在这【江协科技STM32】DMA直接存储器存储-学习笔记-CSDN博客 查看数据地址: uint8_t aa 0x88;int main(void) {OLED_Init();OLED_ShowHexNum(1,1,aa,4); //显示十六进制数 OLED_ShowHexNum(2,1,(uint32_t)&aa,8);wh…...
[Web]ServletContext域(Application)
简介 Web应用的Application域的实现是通过ServletContext对象实现的。整个Web应用程序的所有资源共享这个域。生命周期与Web应用程序相同,即当前Web应用程序启动时(以服务器视角而非访客视角)出生,Web应用服务程序关闭时停止。 通…...
计算机网络--访问一个网页的全过程
文章目录 访问一个网页的全过程应用层在浏览器输入URL网址http://www.aspxfans.com:8080/news/index.aspboardID5&ID24618&page1#r_70732423通过DNS获取IP地址生成HTTP请求报文应用层最后 传输层传输层处理应用层报文建立TCP连接传输层最后 网络层网络层对TCP报文进行处…...
JVM G1垃圾回收器详细解析
G1内存布局 Garbage First(简称G1)收集器摒弃了传统垃圾收集器的严格的内存划分,而是采用了基于Region的内存布局形式和局部回收的设计思路。 G1垃圾收集器把Java堆划分为2048个大小相等的独立的Region,每个Region大小取值范围为1-32MB,且必…...
OpenGL中绘制图形元素的实现(使用visual studio(C++)绘制一个矩形)
目标:使用OpenGL提供的函数绘制矩形、线段、三角形等基本图形元素 所需效果 实验步骤 1、配置OpenGL(详情参见OpenGL的配置) 2、头文件引入 #include <gl/glut.h> 3、编写方法体 1>矩形实现 //绘制矩形 void DisplayRectangl…...
datax-coud部署
centos7系统环境安装 jdk1.8安装 cd /usr/local 上传jdk文件到/usr/local目录下解压缩 tar -zxvf jdk-8u261-linux-x64.tar.gz# 配置环境变量 vim /etc/profileexport JAVA_HOME=/usr/local/jdk1.8.0_261 export CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/lib export PATH=$JAVA_…...
数据库---sqlite3
数据库: 数据库文件与普通文件区别: 1.普通文件对数据管理(增删改查)效率低 2.数据库对数据管理效率高,使用方便 常用数据库: 1.关系型数据库: 将复杂的数据结构简化为二维表格形式 大型:Oracle、DB2 中型:MySql、SQLServer …...
Android StrictMode 使用与原理深度解析
Android StrictMode 是 Android 系统提供的一种开发者工具,用于检测应用主线程中不合理的耗时操作(如磁盘 I/O、网络请求等)和内存泄漏问题。通过配置策略和惩罚机制,它帮助开发者在早期发现潜在性能问题,提升应用流畅…...
js和java中方法重载(js本身是不支持方法重载,方便对比学习)
js如果需要实现方法重载 示例 1:根据参数数量实现重载 function overloadExample() {if (arguments.length 1) {console.log(一个参数:, arguments[0]);} else if (arguments.length 2) {console.log(两个参数:, arguments[0], arguments[1]);} else {console.l…...
