web漏洞——文件上传漏洞(upload-labs)

article/2025/10/13 0:49:29

一、文件上传漏洞简介、原理、高危触发点、防御

文件上传漏洞简介:
由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身权限向 服务器 上上传可执行的动态脚本文件。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。
这种攻击方式是最为直接和有效的,“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。
文件上传漏洞本身就是一个危害巨大的漏洞,WebShell更是将这种漏洞的利用无限扩大。大多数的上传漏洞被利用后攻击者都会留下WebShell以方便后续进入系统攻击者在受影响系统放置或者插入WebShell后,可通过该WebShell更轻松,更隐蔽的在服务中为所欲为。
webshell以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称之为一种网页后门。一句话木马:最常用的webshell。
文件上传漏洞原理:
在文件上传的功能处,服务端脚本语言未对上传的文件进行严格验证和过滤,导致恶意用户上传恶意的脚本文件,就有可能获取执行服务端命令的能力,这就是文件上传漏洞。
文件上传漏洞对Web应用来说是一种非常严重的漏洞。一般情况下,Web应用都会允许用户上传一些文件,如头像、附件等信息,如果Web应用没有对用户上传的文件进行有效的检查过滤,那么恶意用户就会上传一句话木马等Webshell,从而达到控制Web网站的目的。
文件上传漏洞高危触发点
存在文件上传功能的地方都有可能存在文件上传漏洞。
比如相册头像上传,视频、照片分享。论坛发帖和邮箱等可以上传附件的地方也是上传漏阔的高危地带,另外像文件管理器这样的功能也有可能被攻击者所利用。
值得注意的是,如果移动端也存在类似的操作的话,那么相同的原理,也存在文件上传漏洞的风险。
防御措施
1、上传文件的存储位置与服务器分离;
2、上传的文件重新 修改文件名文件后缀名;(如何确定后缀名防止修改:前端传递,后端再校验)
3、文件上传的 上传保存路径根据业务进行分离;下载时 根据重新生成的文件名进行下载;

二、防御措施、and绕过措施(攻击方法,即向网站上传木马文件的方法。针对不同防御有不同绕过。)

(1)前端检测(JS检测)

例如,upload-labs Pass-01

主要是通过javascript代码进行检测,非常容易进行绕过。

1、原理:

  Web应用系统会对用户上传的文件进行校验,校验是通过前端javascript代码完成的。

但由于恶意用户可以对前端javascript进行修改或者是通过抓包软件篡改上传的文件,这就会导致基于js的校验很容易被绕过。

2. 如何判断当前页面使用前端js的验证方式:

  前端验证通过以后,表单成功提交后会通过浏览器发出─条网络请求,但是如果前端验证不成功,则不会发出这项网络请求;可以在浏览器的网络元素中查看是否发出了网络请求。

3. 绕过方法:

①删除或者禁用js:火狐浏览器-->about:config-->JavaScriptenable-false (ajax)

②使用代理上传文件,Burp Suite;上传符合要求的文件类型,抓包修改文件类型。

3.1 删除js绕过:

直接删除代码中onsubmit事件中关于文件上传时验证上传文件的相关代码即可(以upload-labs Pass-01举例):

checkFile()函数代码举例如下:

或者可以不加载所有js,还可以将html源码copy一份到本地,然后对相应代码进行修改,本地提交即可。

(2)后端检测_后缀名检测漏洞:

1. 原理:

  通常是针对文件的扩展名后缀进行检测,主要是通过黑白名单进行过滤检测,如果不符合则不允许上传。

2. 黑名单:

2.1 原理:

  黑名单检测:一般有个专门的 blacklist 文件,里面会包含常见的危险脚本文件。 例如: fckeditor 2.4.3 或之前版本的黑名单:

2.2 绕过方法:

①解析漏洞

.htaccess文件解析漏洞- apache解析漏洞

IIS7.0 | IIS7.5 | Nginx的解析漏洞

IIS6.0解析漏洞

②截断上传

截断类型:PHP%00截断

截断原理:由于00代表结束符,所以会把00后面的所有字符都截断

截断条件:PHP版本小于5.3.4,PHP的magic_quotes_gpc为OFF状态

③大小写绕过
比如:aSp和pHp之类。
④黑名单扩展名的漏网之鱼
比如: asa和cer之类 asp:asaceraspxjsp:jspxjspfphp:phpphp3php4php5phtmlphtexe:exee
⑤利用Windows的命名机制
shell.php.shell.php空格shell.php:1.jpgshell. php::$DATAshell.php:1.jpg 在windows中,后缀名后面的点和空格都会被删除掉。
⑥双写绕过
有时候在检测时,后台会把敏感字符替换成空格,这个时候,我们可以使用双写进行绕过。比如:pphphp

3. 白名单:

3.1 原理:

白名单检测:一般有个专门的 whitelist 文件,里面会包含的正常文件:JpgpngGIF

3.2 绕过方法:

①解析漏洞

.htaccess文件解析漏洞

apache解析漏洞

IIS7.0 | IIS7.5 | Nginx的解析漏洞

IIS6.0解析漏洞

②截断上传

截断类型:PHP%00截断

截断原理:由于00代表结束符,所以会把00后面的所有字符都截断

截断条件:PHP版本小于5.3.4,PHP的magic_quotes_gpc为OFF状态

(3)后端检测_00截断:

1. 原理:

  虽然web应用做了校验,但是由于文件上传后的路径用户可以控制,攻击者可以利用手动添加字符串标识符0X00的方式来将后面的拼接的内容进行截断,导致后面的内容无效,而且后面的内容又可以帮助我们绕过黑白名单的检测。

2. 绕过思路:

  在C语言中,空字符有一个特殊含义,代表字符串的拼接结束。   这里我们使用的是php语言,属于高级语言,底层靠C语言来实现的,也就是说空字符的字符串拼接结束功能在PHP中也能实现。但是我们在URL中不能直接使用空,这样会造成无法识别;我们通过查看ASCII对照表,发现ASCII对照表第一个就空字符,它对应的16进制是00,这里我们就可以用16进制的00来代替空字符,让它截断后面的内容。

使用burpsuite进行抓包,因为这里是通过URL进行传递的文件上传后存储路径,所以需要对16进制的00进行URL编码,编码的结果就是%00,通过这种方式,就可以%00截断后面的内容,让拼接的文件名不再进行生效:

(4)后端检测_MIME检测:

1. 什么是MIME:

MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。

绕过上传限制-服务端绕过MIME检测:

2. 常见的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文档)

3. 检测方式:

  在文件上传过程中,服务端会针对我们的上传的文件生成一个数组,这个数组其中有一项就是这个文件的类型file_type;服务端对文件进行检测时,就是通过检测脚本中的黑白名单和这个数组中的file_type进行对比,如果符合要求就允许上传这个文件。

4. MIME绕过的原理:

  部分Web应用系统判定文件类型是通过content-type字段,黑客可以通过抓包,将content-type字段改为常见的图片类型,如image/gif,从而绕过校验。

(5)后端检测_文件头检测漏洞:

1. 原理:

  在每一个文件(包括图片,视频或其他的非ASCII文件)的开头(十六进制表示)实际上都有一片区域来显示这个文件的实际用法,这就是文件头标志。我们可以通过16进制编辑器打开文件,添加服务器允许的文件头以绕过检测。

2. 常见的文件头:

注意:下面的文件头的格式是16进制的格式:

GIF:47 49 46 38 39 61 png:89 50 4E 47 0D 0A 1A 0A JPG:FF D8 FF E0 00 10 4A 46 49 46

在进行文件头绕过时,我们可以把上面的文件头添加到我们的一句话木马内容最前面,达到绕过文件头检测的目的。

(6)后端检测_内容检测图片马绕过:

1. 漏洞原理:

  一般文件内容验证使用getimagesize函数检测,会判断文件是否是一个有效的文件图片,如果是,则允许上传,否则的话不允许上传。 本实验就是将一句话木马插入到一个[合法]的图片文件当中,然后用webshell管理工具进行远程连接。

2. 图片马制作:

准备一张图片,这里为a.png,和一个一句话木马,通过以下命令合成一个图片马3.php: a.php内容:

<?php phpinfo();?>

复制

命令:

copy a.png /b + a.php /a 3.php  
/b:指定以二进制格式复制、合并文件,用于图像或者声音类文件
/a:指定以ascii格式复制、合并文件用于txt等文本类文件

复制

注:这条命令的意思是:通过copy命令,把a.png图片文件,以二进制文件形式添加到a.php文件中,以ASCII文本文件形式输出为3.php文件。

3. 解析图片马:

  一般解析图片马需要结合解析漏洞或者文件包含才能解析图片马;

(7)解析漏洞:

1. .htaccess文件解析漏洞:

1.1 漏洞利用前提::

  web具体应用没有禁止.htaccess文件的上传,同时web服务器提供商允许用户上传自定义的.htaccess文件。

1.2 原理:

.htaccess文件(或者"分布式配置文件") ,全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法,即,在一个特定的文档目录中放置一个包含一个或多个指令的文件,以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。

1.3 利用方式:

上传覆盖.htaccess文件,重写解析规则,将上传的带有脚本马的图片以脚本方式解析。

1.4 .htaccess文件内容:

.htaccess文件解析规则的增加,是可以按照组合的方式去做的,不过具体得自己多测试。
<FilesMatch "evil.gif">
SetHandler application/x-httpd-php   #在当前目录下,如果匹配到evil.gif文件,则被解析成PHP代码执行
AddHandler php5-script .gif          #在当前目录下,如果匹配到evil.gif文件,则被解析成PHP代码执行
</FilesMatch>

复制

2. Apache解析漏洞:

2.1 漏洞原理:

Apache 解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断。比如test.php.a.b的“.a”和“.b”这两种后缀是apache不可识别解析,apache就会把test.php.a.b解析成test.php。

2.2 影响版本:

apache 1.x apache 2.2.x

3.  IIS6.0解析漏洞:

IIS6.0解析漏洞分两种: 1、目录解析: 以xx.asp命名的文件夹里的文件都将会被当成ASP文件执行。 2、文件解析: xx.asp;.jpg 像这种畸形文件名在;后面的直接被忽略,也就是说当成xx.asp文件执行。

IIS6.0 默认的可执行文件除了asp还包含这三种 .asa.cer.cdx。

4. IIS7.0 | IIS7.5 | Nginx的解析漏洞:

4.1 原理:

Nginx拿到文件路径(更专业的说法是URI)/test.jpg/test.php后,一看后缀是.php,便认为该文件是php文件,转交给php去处理。php一看/test.jpg/test.php不存在,便删去最后的/test.php,又看/test.jpg存在,便把/test.jpg当成要执行的文件了,又因为后缀为.jpg,php认为这不是php文件,于是返回Access denied。   这其中涉及到php的一个选项:cgi.fix_pathinfo,该值默认为1,表示开启。开启这一选项PHP可以对文件路径进行修理。

举个例子,当php遇到文件路径/1.jpg/2.txt/3.php时,若/1.jpg/2.txt/3.php不存在,则会去掉最后的/3.php,然后判断/1.jpg/2.txt是否存在,若存在,则把/1.jpg/2.txt当做文件/1.jpg/2.txt/3.php,若/1.jpg/2.txt仍不存在,则继续去掉/2.txt,以此类推。

4.2 漏洞形式:

www.xxxxx.com/UploadFiles/image/1.jpg/1.php

4.3 另外两种解析漏洞:

www.xxxxx.com/UploadFiles/image/1.jpg%00.phpwww.xxxxx.com/UploadFiles/image/1.jpg/%20\0.php

(8)条件竞争漏洞:

  条件竞争漏洞是一种服务器端的漏洞,由于服务器端在处理不同用户的请求时是并发进行的,因此,如果并发处理不当或相关操作逻辑顺序设计的不合理时,将会导致此类问题的发生。

上传文件源代码里没有校验上传的文件,文件直接上传,上传成功后才进行判断:如果文件格式符合要求,则重命名,如果文件格式不符合要求,将文件删除。

由于服务器并发处理(同时)多个请求,假如a用户上传了木马文件,由于代码执行需要时间,在此过程中b用户访问了a用户上传的文件,会有以下三种情况:

1.访问时间点在上传成功之前,没有此文件。

2.访问时间点在刚上传成功但还没有进行判断,该文件存在。

3.访问时间点在判断之后,文件被删除,没有此文件。

(9)二次渲染漏洞:

1. 二次渲染原理:

    在我们上传文件后,网站会对图片进行二次处理(格式、尺寸要求等),服务器会把里面的内容进行替换更新,处理完成后,根据我们原有的图片生成一个新的图片并放到网站对应的标签进行显示。

2. 绕过:

1、配合文件包含漏洞: 将一句话木马插入到网站二次处理后的图片中,也就是把一句话插入图片在二次渲染后会保留的那部分数据里,确保不会在二次处理时删除掉。这样二次渲染后的图片中就存在了一句话,在配合文件包含漏洞获取webshell。 2、可以配合条件竞争: 这里二次渲染的逻辑存在漏洞,先将文件上传,之后再判断,符合就保存,不符合删除,可利用条件竞争来进行爆破上传

3. 如何判断图片是否进行了二次处理?

  对比要上传图片与上传后的图片大小,使用16进制编辑器打开图片查看上传后保留了哪些数据,查看那些数据被改变。

http://chatgpt.dhexx.cn/article/v2OZFH2T.shtml

相关文章

Python中OpenCV+Numpy安装配置

1.安装OpenCV Numpy 安装OpenCV 下载地址&#xff1a;http://www.lfd.uci.edu/~gohlke/pythonlibs/ 安装Numpy 下载地址&#xff1a;https://pypi.python.org/pypi/numpy 根据python版本选择相应的opencv版本&#xff0c;例如在Windows64操作系统下python3.7.1…

python中numpy模块安装_numpy安装,python中怎样安装numpy模块

python中怎样安装numpy模块 1.在python官网https://pypi.python.org/pypi/numpy中找到安装的python版本对应的numpy版本。 例如: python版本是 下载的对应numpy版本是 2.将numpy下载到 python的安装目录下的scripts文件夹中 3.然后在cmd中执行以下命令 ip3.6 install D:j…

python之Numpy 安装

1、在windows下&#xff0c;ctrlR&#xff0c;进入运行&#xff1b; 2、进入到Python所在的目录&#xff0c;默认为c&#xff1a;\\Python27 3、运行命令 python -m pip install numpy 4、系统显示如下&#xff1a;collecting numpy,开始自动进行安装&#xff1b; 5、显示进…

numpy的安装与使用

文章目录 前言 一、numpy是什么&#xff1f; 1、Numpy的数据结构 1.1 元数据&#xff08;metadata&#xff09; 1.2 实际数据 2、ndarray数组对象的特点 3、Numpy的优点 二、安装numpy 三、开始使用 3.1 引入库 3.2 查看numpy安装版本 3.3 牛刀小试 3.4 numpy VS list 总结 前言…

【Numpy学习笔记1】numpy安装、维度、基本运算、改变数据形态

1.Numpy使用场景 需要批量处理数据的时候机器学习&#xff0c;人工智能这些需要进行海量数据运算处理的地方写游戏里面的物体运行逻辑时&#xff0c;经常涉及到矩阵、向量运算机器人模拟环境&#xff0c;背后的环境反馈信息&#xff0c;全是靠批量数据算出来的任何需要做统计的…

pythonnumpy官网_Numpy安装

问题引入&#xff1a;电脑里安装了从官网下载的python3.8.0,。先使用了菜鸟教程的方法2安装。https://www.runoob.com/numpy/numpy-install.html 发现产生错误。先是提示我的pip工具没有更新到最新版本&#xff0c;于是根据提示更新后&#xff0c;发现仍有错误&#xff0c;于是…

numpy的安装

安装 1.以管理员身份打开cmd 2.输入命令安装numpy插件 pip insatll numpy 3.使用以下命令查看是否安装成功 pip list 出现numpy就安装成功

如何在matlab坐标轴上输入希腊字符和开根号符号

1.以输入\mu为例&#xff0c;要将解释器选择为 tex&#xff0c;不过matlab默认的就是tex. xlabel(\mum,FontName,Arial,fontsize,24,Interpreter,tex); 效果如下图所示&#xff1a; 2.输入开根号&#xff0c;需要把解释器改为latex. clear,clc ylabel($Z_{0} \sqrt {\epsilo…

matlab之方程式求根

一.利用syms和solve() 利用syms和sym定义一个标志变量 syms x sym(‘x’) 2.求方程根&#xff1a; 求x-2y5与xy6的联立方程组的根&#xff1a; 3.对函数求微分 4.对函数求积分 5. fsolve()

利用MATLAB对于符号方程进行求解

在数学计算中&#xff0c;我们经常需要对于方程或者是方程组进行求解&#xff0c;对方程的求解是数学中的一个重要的知识点。在MATLAB中提供了solve函数用于对于符号表达式的求解。solve函数有多种调用方式&#xff0c;包括如下所示&#xff1a; solve(equ)&#xff1a;对于等…

利用matlab进行多项式求根——符号解

问题描述&#xff1a;对于一个方程&#xff0c;比如&#xff1a; a x 2 b x c 0 ax^2bxc0 ax2bxc0&#xff0c;我们想要求出关于x的表达式&#xff08;求根&#xff09;。 如果a&#xff0c;b&#xff0c;c是已知的&#xff0c;或者说是某个确定的数值&#xff0c;那么我们…

MATLAB(十)方程式求根

文章目录 前言符号寻根法符号根查找&#xff1a;solve ()解决多个方程用符号表示的方程Exercise练习符号区分&#xff1a;diff ()Exercise练习象征性的集成&#xff1a;int()Exercise练习回顾函数句柄()fsolve()Exercise练习fzero()求多项式的根&#xff1a;roots()二分法(或分…

matlab根号二,matlab根号二怎么打_常见问题解析,matlab,根号二,根号

matlab级数求和的方法_常见问题解析 matlab级数求和使用symsum函数&#xff0c;有4种方式&#xff0c;分别为symsum(expr)、symsum(expr,v)、symsum(expr,a,b)和symsum(f,v,a,b)。 matlab根号二怎么打 matlab中根号使用^来表示&#xff0c;根号二的表示方法为&#xff1a;2^0.5…

matlab 坐标轴根号,Matlab中根号表示怎么操作?根号表示教程分享

最近很多网友表示自己不清楚Matlab中根号表示的操作&#xff0c;而本篇文章就来给大家讲解Matlab中根号表示的教程介绍&#xff0c;大家都来一起学习吧。 Matlab中根号表示的教程介绍 常数根号的表示方法 1、打开matlab&#xff0c;在命令行窗口中输入“9^0.5”&#xff0c;按回…

matlab中根号的表示方法,Matlab中根号表示方法分享

现在许多朋友都已经安装使用Matlab这款软件&#xff0c;但不少伙伴使用过程里还不会根号表示方法&#xff0c;那么究竟是如何操作的呢&#xff1f;今日就来下文看看Matlab中根号表示教程吧。 常数根号的表示方法 1、打开matlab&#xff0c;在命令行窗口中输入9^0.5&#xff0c;…

记Git报错-refusing to merge unrelated histories

环境 系统&#xff1a;win10 git version 2.9.0.windows.1 创建一个新的分支&#xff0c;很久没用了。要重新启用&#xff0c;拉取最新分支的代码&#xff0c;结果报错&#xff1a;refusing to merge unrelated histories fatal: refusing to merge unrelated histories 解…

git: refusing to delete the current branch

最近&#xff0c;不知怎么操作&#xff0c;导致远程test分支无法删除。 原因是&#xff0c;远程仓库里的当前分支是test。进入远程仓库目录&#xff0c;git branch。由于已经解决&#xff0c;所以没有图。在网上找相关资料&#xff0c;都是github里面的操作。但是这个是自己搭建…

fatal: refusing to merge unrelated histories解决

背景&#xff1a;由于公司进行了仓库迁移&#xff0c;同事直接把代码init推进了新的仓库地址&#xff0c;我想在本地代码上切换远程仓库地址进行拉取远端代码时出现报错“fatal: refusing to merge unrelated histories”&#xff0c;大概意思是&#xff1a;“拒绝合并不相关的…

解决Git报错: fatal: refusing to merge unrelated histories

如果合并了两个不同的开始提交的仓库&#xff0c;在新的 git 会发现这两个仓库可能不是同一个&#xff0c;为了防止开发者上传错误&#xff0c;于是就给下面的提示 git无法pull仓库refusing to merge unrelated histories &#xff08;拒绝合并不相关仓库&#xff09; 遇到上问…