文件上传漏洞-用骗子的角度分析

news2024/12/26 20:52:55

(一)文件上传漏洞

文件上传漏洞,发送在用户上传文件功能中,很多网址都对上传的文件格式进行限制,但是被攻击机者找到漏洞,把木马、病毒进行上传,然后控制服务器。对上传的文件格式不是不限制,而是限制了,攻击者还有办法用特别的方法绕过。

有个渗透测试大佬说:做我们这行的,思想要变态,行为要严谨。要用非同寻常的目光与思维去破解程序员设置的安全检测机制。

网站都是程序员开发出来,本次就以骗子的的角度,对程序员开发、设置的检测方法进行欺骗。

话不多说,今天就做一回骗子,欺骗欺骗哪些文件上传检测方法。知己知彼,做骗子也做个有格调的骗子,我们的先了解网站程序员都是怎么检测上传的文件格式的,再想办法骗骗。

以下面是常见一个文件上传检测方法,我们骗骗

(二)上传限制方法与欺骗方法

1、前端js

场景:这是用前端的js,实现上传检测。

使用js实现上传检测过程:

  1. 给上传文件的input元素绑定一个change事件
  2. 在change事件中获取到用户选择的文件
  3. 判断文件的类型、后缀、大小等属性,例如限制文件大小不能超过特定值,或者限制文件类型只能是某些特定类型(比如图片)
  4. 如果文件属性不符合要求,弹出提示框告知用户,同时清空input元素中所选文件
  5. 如果文件属性符合要求,上传文件或进行其他相关操作。

欺骗方法:

方法一:直接在浏览器禁用js
这是一个只能上传图片的一个靶场,我们按F12进入开发者模式,直接把绑定的方法删除(直接暴力删除,让你检测都没有,看你还这么检测),这样就直接绕过


效果如下:已经把文本文件上传成功。


2、方法二:burp 抓包,修改上传文件后缀
我们上传一个符合文件格式,在点击上传之后,使用burpsuite或者其他Http代理工具拦截并修改请求,将文件名后缀改回原来的格式如.txt(先用符合的png文件上传,骗骗前端的js,然后点击上传之后,我们在修改回来),然后再次发送请求。


结果也是上传成功的。
之所以用burp抓包,那是因为不同的环境和配置可能会导致上传文件的校验方式不同,因此一些简单的靶场可能允许你直接修改文件后缀名,而不需要使用Burp Suite等代理工具。

但是,在一些实际环境中,上传文件的校验可能会比较严格,尤其是在Web应用程序中使用了一些防护措施(例如WAF),直接修改文件后缀名可能会被拦截或导致上传失败。此时,使用代理工具进行修改会更加稳妥

2、文件名包含绕过

场景:使用MIME 校验进行文件检测

解释:

        MIME类型是指在互联网上定义的一种多用途文件类型,它是通过在HTTP标头中添加Content-Type字段来表示的。任何Web应用程序通常使用MIME类型对上传文件进行检测和校验。
        上传文件内容校验可以分为两个阶段。首先,在本地客户端进行第一步校验,检查上传文件的大小是否符合要求,然后将文件发送到服务器。其次,在服务器进行第二步校验,验证文件的大小、类型和内容是否符合预期。

        MIME类型检测就是服务器检测的一种,对于MIME校验,服务器通常根据文件的MIME类型来判断文件类型是否合法。如果上传的文件不包含或者包含了错误的MIME类型,服务器将拒绝上传文件并返回相关错误信息。常见的校验如下

text/plain(纯文本)
text/html(HTML文档)
text/javascript(js代码)
application/xhtml+xml(XHTML文档)
image/gif(GIF图像)
image/jpeg(JPEG图像)
image/png(PNG图像)
video/mpeg(MPEG动画)
application/octet-stream(二进制数据)
application/pdf(PDF文档)

简单来说就是,我们在点击上传的时候,会在请求信息的头部,加上一个Content-Type字段,用来识别文件类型,当数据传到服务器,服务器根据这个Content-Type字段的值来判断是否上传文件的类型符合。

欺骗方法:修改Content-Type的值

直接上传非法文件,然后使用burpsuite或者其他Http代理工具拦截并修改请求。可以看到原本上传的文件在Content-Type赋值为application/octet-stream,这是描述二进制数据或者未知的数据类型。于网络传输,由于存在各种未知的数据类型和不同的操作系统,因此在发送二进制数据时,许多服务器都使用application/octet-stream类型来表示未知文件类型或不确定文件类型
把Content-Type赋值为:image/jpeg,这是ipg图片格式,进行重发之后,

3、getimagesize检测

场景:在php网页中,利用getimagesize函数来检测文件上传

解释:

在PHP中,getimagesize()函数是用于获取图片信息的函数,包括图片的类型、宽度、高度和其它相关信息等,会返回一个数组,具体信息如下:

  • 图片宽度,像素为单位
  • 图片高度,像素为单位
  • 图片类型标识,表示图片类型的常量值,例如IMAGETYPE_GIFIMAGETYPE_JPEGIMAGETYPE_PNG
  • 图片类型描述,表示图片类型的可读字符串,例如"PNG"、"JPEG"等
  • 用于HTML标签中的图片宽度,以像素为单位
  • 用于HTML标签中的图片高度,以像素为单位
  • 其他图片信息(如果参数$imageinfo有提供)
     

 
这是服务器段检测,在一个只允许图片上传的网址中,通过getimagesize函数来获取,上传文件

欺骗方法:把文件和图片拼接到一块,在进行上传

利用copy把图片和文件拼接到一起(这种像欺骗方法像披着羊皮的狼,利用羊皮的外部特征进行欺骗),上传之后,因为里面有普通的的信息,利用getimagesize函数来获取时候,因为拼接到一起的内容里依旧还存在图片的信息,所有能够成功获取到信息,所有服务器会认为,上传的是一个图片。
方法:
在cmd中,进入文件的路径,输入:
copy 1.jpg /b + 1.php /a test.jpg

copy 1.jpg /b + 1.php /a test.jpg 命令的作用是将 1.jpg 和 1.php 文件合并成一个文件 test.jpg,并以二进制模式将两个文件内容拼接在一起。具体解释如下:

  • 1.jpg:是要在输出文件中作为因子一的文件。
  • /b:以二进制模式复制。
  • +:代表将1.jpg1.php的文本内容拼接在一起。
  • 1.php:是要在输出文件中作为因子二的文件。
  • /a:将 ASCII 文本内容附加到文件的末尾。
  • test.jpg:是合并后输出的文件,包含了1.jpg1.php两个文件的内容。因为文件扩展名是 .jpg,所以这个文件实际上不是一个真正的 JPEG 图像,而是一个合并的文件

 这个命令的作用是将两个文件合并成一个,并将它们的内容拼接在一起

结果如下,可以看到可以访问成功

 

 因为这是一个文件和图片拼接在一起,上传的时候,是以图片形式存在的,所有不能直接利用,需要通过其他漏洞信息,例如文件包含漏洞,访问我们刚刚上传的文件

 

4、黑名单绕过

场景:当文件上传到后台服务器中时,服务器会识别文件类型,与一个禁止上传的名单匹配,如果所上传的文件类型是该名单中,就禁止上传。这个名单就是黑名单,明确禁止不予上传的文件类型。其实在现实中,有许许多多的限制规则的,这里例举几项。

欺骗方法:

方法一:寻找漏网之鱼

有些网址只是.asp .aspx .php .jsp等文件类型,可以器其它找漏网之鱼绕过(你不让我过,我让我兄弟上,我不是一个人,我有一帮兄弟) 例如:特殊文件名绕过: .php3 .php4 .php5 .phtml .phtm .phps .phpt .php3(但是这里有个条件,对方服务器配置也要对这些php其他文件名配置了解析的设置,否则就算上传了成功了,也解析不了)

方法二:大小写绕过

有些一网址只是对文件大小写,没有限制,只是限制php文件,但是没有限制Php、pHp、PHP等等文件,我们就可以改变一些大写试试(这种欺骗方法就像:鲁迅喝酒,跟我周树人什么事),服务器如果没有大小写过滤,我们是可能上传成功的

方法三:利用上传.htaccess

        在一些网址中,它的黑名单已经有许许多多的例子,例如php3 .php4 .php5等也囊括在内,很是齐全,让我们无法从漏网之鱼下手。此时我们就要把对象转移一下(漏洞目标那么多,我们不能单盯着一处不放),我们尝试上传.htacess文件看看,有一些文件时没有禁止上传这个文件的。

        htaccess 文件是 Apache 服务器中的一个配置文件,它负责相关目录下的网页配置,是写一些规则方面的配置。通过 htaccess 文件,可以实现:网页 301 重定向、自定义 404 错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。

        在文件上传漏洞的利用中,我们可以通过htaccess文件,写入规则,把读取png图片转化为解析层php文件,也就是,我们虽然上传的是png等图片格式,但是通过htaccess之后,服务器会解析成php文件(这种欺骗方法,就像给服务器戴上”有色眼镜“,然后每当我上传图片,服务器都图片当作php文件处理,当我访问图片,服务器也那个图片当作php文件然后呈现回来)

具体做法如下:

新建.htaccess文件,内容为:
 

<FilesMatch ".png">
SetHandler application/x-httpd-php
</FilesMatch>

作用:把任何.png格式的文件,协议为php

 建立1.txt文件,立马存放探针(测试用),修改文件后缀为png,进行伪装,点击上传

结果上传成功,当我们访问1.png文件时候,能够触发探针文件

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL实战解析底层---为什么这些SQL语句逻辑相同,性能却差异巨大

目录 前言 案例一&#xff1a;条件字段函数操作 案例二&#xff1a;隐式类型转换 案例三&#xff1a;隐式字符编码转换 前言 在MySQL中&#xff0c;有很多看上去逻辑相同&#xff0c;但性能却差异巨大的SQL语句对这些语句使用不当的话&#xff0c;就会不经意间导致整个数据…

动态规划V (85、91、97)-最近都开始摆烂

CP85 最大矩形 题目描述&#xff1a; 给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵&#xff0c;找出只包含 1 的最大矩形&#xff0c;并返回其面积。 学习记录&#xff1a; 对每一个地方都去统计最大举行的话&#xff0c;会有很多多余的计算&#xff0c;题…

windows操作系统线程结构体

上一篇我们介绍了进程结构体&#xff0c;这节我们介绍下线程结构体&#xff1a;ETHREAD。还是去windbg里面去看一下这个结构体的长相: 依旧是一大堆成员&#xff0c;我们只关注一些比较重要的结构体成员。在进程结构体中的第一个成员是一个子结构体Pcb,在线程结构体中&#xff…

【Simulink】基于FCS-MPC的带阻感负载的三相逆变器控制(Matlab Function)

之前写过三相并网逆变器FCS-MPC的博客 &#x1f449;【Simulink】基于FCS-MPC的三相并网逆变器控制&#xff08;Matlab Function&#xff09; 应用的对象是并网的&#xff0c;用一个电压源&#xff08;Three-Phase Programmable Voltage Source&#xff09;模拟交流电网。 本篇…

6.S081——设备中断与驱动部分(串口驱动与Console)——xv6源码完全解析系列(7)

0.briefly speaking 之前我们研究过Xv6中的陷阱机制&#xff0c;并搞懂了系统调用的全部流程&#xff0c;接下来我们以UART和console为研究对象&#xff0c;深入研读一下Xv6内核中有关设备中断驱动的代码&#xff0c;并对UART、shell、console、键盘、显示器等设备的协同运作过…

【算法总结】——排列型回溯

文章目录 排列型回溯例题1——46. 全排列例题2——N皇后 分析回溯时间复杂度的另一种技巧 排列型回溯 相比于组合&#xff0c;排列型回溯对于元素的顺序是有要求的。 为了告诉回溯下面还可以选择哪些数字&#xff0c;可以&#xff1a; 记录已经被选择的数字用一个集合存储还…

【Linux】16. 动静态库

1. 库概念的引出 但是如果只是单纯的将多个.o文件提供给使用者&#xff0c;那么如果.o文件过多链接就会变得非常复杂&#xff0c;于是我们考虑将所有的.o文件打包给使用者提供一个库文件即可。 库的本质就是.o文件的集合 2. 动静态库概念 在之前的学习过程中我们认识到动静态…

免费:5000个高清视频素材 (个人免费版权,含9个利基)

免费&#xff1a;5000个高清视频素材 (个人免费版权&#xff0c;含9个利基) 嘿&#xff01;你喜欢制作视频吗&#xff1f;总是在寻找一些酷炫的素材&#xff0c;但又担心会侵犯版权吗&#xff1f;别担心&#xff0c;我有一个超级好消息要告诉你&#xff01;现在&#xff0c;我…

代码随想录算法训练营第39天 | 62.不同路径 + 63.不同路径 II

今日任务 目录 62.不同路径 - Medium 63.不同路径 II - Medium 62.不同路径 - Medium 题目链接&#xff1a;力扣-62. 不同路径 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器…

【数据结构】排序

插入排序 把当前遍历到的元素前的元素序列是排好序的,把当前元素放到前边的序列中进行排序。 直接插入排序 不带哨兵 void InsertSort(int A[],int n) { int i,j,temp; for(i1;i<n;i) if(A[i]<A[i-1]) { tempA[i]; for(ji-1;j>0 && A[j]>temp;--j) A[j…

深入理解深度学习——BERT派生模型:参数共享ALBERT

分类目录&#xff1a;《深入理解深度学习》总目录 预训练语言模型的一个趋势是使用更大的模型配合更多的数据&#xff0c;以达到“大力出奇迹”的效果。随着模型规模的持续增大&#xff0c;单块GPU已经无法容纳整个预训练语言模型。为了解决这个问题&#xff0c;谷歌提出了ALBE…

深度学习训练营之文本分类识别

深度学习训练营之文本分类识别 原文链接环境介绍前置工作设置环境设置GPU加载数据 构建词典生成数据批次和迭代器模型定义定义实例 定义训练函数和评估函数模型训练模型评估 原文链接 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考…

面具下的flag

打开文件是你的名字动漫的一张图片 用010打开文件&#xff0c;比较可疑的有三处 首先文件头是正确的&#xff0c;只是这边显示的Exif&#xff0c;之前没有特别注意jpg文件有这个头 其次是文件中包含两处flag信息&#xff0c;一个是类似隐藏的文件&#xff0c;一个疑似是第二段f…

Mysql高级查询语句

数据库是用来存储数据&#xff0c;更新&#xff0c;查询数据的工具&#xff0c;而查询数据是一个数据库最为核心的功能&#xff0c;数据库是用来承载信息&#xff0c;而信息是用来分析和查看的。所以掌握更为精细化的查询方式是很有必要的。本文将围绕数据的高级查询语句展开。…

题集-栈和队列的相互转化

这里&#xff0c;队列的性质是先入先出&#xff0c;但是栈的性质是后入先出。两个队列就可以通过相互捯实现数据的后入先出。 typedef int QDataType&#xff1b; //这是一个队列结点的结构 typedef struct QueueNode { struct QueueNode* next; QDataType data; }QNode; //这是…

C++之工厂模式

目录 一、为什么要使用工厂模式 优点 缺点 二、简单工厂&#xff08;Simple Factory&#xff09; 好处&#xff1a; 不足&#xff1a; 三、工厂方法&#xff1a; 好处&#xff1a; 不足&#xff1a; 四、抽象工厂&#xff08;Abstract Factory&#xff09; 一、为什…

RWA 成下一轮加密大叙事,PoseiSwap 的价值正在凸显

PoseiSwap是Nautilus Chain上的首个DEX&#xff0c;在Nautilus Chain模块化开发的支持下&#xff0c;PoseiSwap能够以更具延展性的方式来构建应用&#xff0c;并能够为交易者提供极佳的交易体验。基于Nautilus Chain支持下的Zk-Rollup方案&#xff0c;PoseiSwap构建了基于零知识…

文心一言 VS 讯飞星火 VS chatgpt (45)-- 算法导论6.1 3题

三、证明:在最大堆的任一子树中&#xff0c;该子树所包含的最大元素在该子树的根结点上。 文心一言&#xff1a; 在最大堆中&#xff0c;根结点是整个堆中最大元素的孩子&#xff0c;因此它包含的最大元素是在该子树的根结点上。 我们可以通过递归的方式证明任意子树中的最大…

C++11 线程库—互斥锁

前言 多线程因其调度的随机性和时间片分配&#xff0c;如果没有限制的访问临界资源&#xff0c;会导致出现无法预测的结果&#xff0c;也无法达到预期。 所以&#xff0c;访问临界区&#xff0c;需要是原子性的&#xff0c;在一个线程完成之前&#xff0c;不能有其他线程访问&…

找bug号召

我的博客是为了完成这个找 bug 号召&#xff1a; https://bbs.csdn.net/topics/614134877。 文章目录 测试场景之三&#xff1a; 选择你的身份 测试场景之三&#xff1a; 选择你的身份 同样在个人中心的最下面&#xff0c;你可以看到身份选择的界面。 注意&#xff0c;你要把鼠…