网络安全进阶学习第五课——文件上传漏洞

news2024/11/23 21:14:01

文章目录

  • 一、常见文件上传点
  • 二、任意文件上传漏洞
  • 三、任意文件上传危害
  • 四、webshell
  • 五、上传木马所需条件
  • 六、木马上传流程
  • 七、上传绕过
    • 1、绕过JS验证
      • 1)Burpsuite剔除响应JS。
      • 2)浏览器审计工具剔除JS
    • 2、绕过MIME-Type验证
      • 1)利用抓包工具,拦截请求包
      • 2)MIME-Type类型
      • 3)验证MIME-Type代码分析
    • 3、绕过黑名单验证
      • 1)文件后缀名验证
      • 2)基于黑名单验证代码分析
      • 3).htaccess文件`(针对Apache)`
      • 4)大小写绕过
      • 5)user.ini文件绕过
      • 6)空格绕过
      • 7)`.`号绕过
      • 8)特殊符号绕过
      • 9)路径拼接绕过
      • 10)双写绕过
    • 4、白名单绕过(00截断)
    • 5、文件包含漏洞绕过
    • 6、文件内容检测绕过
      • 1) 文件幻数(文件头)检测绕过:
      • 2) getimagesize()检测绕过
      • 3) exif_imagetype()检测绕过
    • 7、竞争条件绕过
    • 8、脏字符绕过
    • 9、文件路径修改绕过
    • 10、HPP漏洞绕过
      • 1)HPP漏洞
      • 2)漏洞原理
      • 3)漏洞利用
  • 八、防护措施
  • 九、靶场演示


一、常见文件上传点

大部分的网站和应用系统都有上传功能,如用户头像上传,图片上传,文档上传等。


二、任意文件上传漏洞

由于对上传文件未作过滤过滤机制不严(文件后缀或类型),导致恶意用户可以上传脚本文件,通过上传文件可以达到控制网站权限的目的。


三、任意文件上传危害

  1. 攻击者可获得网站控制权限;
  2. 查看、修改、删除网站数据;
  3. 通过提权漏洞可获得主机权限。

四、webshell

一种网页后门,以以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称做为一种网页后门

黑客在入侵了一个网站后,通常会将asp或php后门文件与网站服务器WEB目录下正常的网页文件混在一起,然后就可以使用浏览器来访问asp或者php后门,得到一个命令执行环境,以达到控制网站服务器的目的。

常见的一句话木马:

  • PHP的一句话木马:<?php @eval($_POST[‘pass’]);?>
  • ASP的一句话木马:<%eval request(“pass”)%>
  • ASPX的一句话木马:<%@ Page Language=”Jscript”%>
    <%eval(Request.Item[“pass”],”unsafe”);%>

五、上传木马所需条件

  • 概念
    利用文件上传漏洞,通过向服务端提交一句简短代码或木马,配合本地客户端(菜刀、蚁剑等工具)实现webshell功能

满足这三个条件,攻击者就能够成功入侵:

  1. 木马上传成功,未被杀;
  2. 知道木马的路径在哪;(假如不知道上传文件的路径在哪里,可以:
    • 爆破/遍历。
    • 让程序报错,例如乱修改URL或者随意输入一个不存在的路径)
  3. 上传的木马能正常运行(解析)。

六、木马上传流程

  1. 客户端JavaScript前端检测(几乎可以忽略)
  2. 服务器端MIME类型检测
  3. 服务端目录路径检测
  4. 服务端文件扩展名检测
  5. 服务端文件内容检测

部分网站带有文件上传功能,如果这个功能不做过滤,则能够上传任意文件至服务器。利用这个功能上传木马至服务器,则能够控制对应的服务器。

木马上传成功后返回包一般会返回上传木马的路径和文件名。若上传的是一句话木马,用菜刀或者C刀就可以控制服务器。


七、上传绕过

1、绕过JS验证

1)Burpsuite剔除响应JS。

对于JS前端验证,直接删除掉JS代码之后就可以绕过JS验证。
在这里插入图片描述

2)浏览器审计工具剔除JS

利用浏览器的审查工具剔除JS之后,保存为新文件然后进行文件上传。
在这里插入图片描述

2、绕过MIME-Type验证

1)利用抓包工具,拦截请求包

修改数据包请求中的Content Type字段,然后再发送出去。
在这里插入图片描述

2)MIME-Type类型

链接: 常见的MIME-Type类型与文件后缀名

3)验证MIME-Type代码分析

查看源代码分析 使用 $_FILE[‘upload_file’][‘type’] 获取上传文件的MIME-Type类型。其中upload_file是在表单中定义的。(该验证方式主要是检测请求包里面的类型字段)
在这里插入图片描述

3、绕过黑名单验证

1)文件后缀名验证

  • 基于文件后缀名验证介绍:
    对于文件上传模块来说,尽量避免上传可执行的脚本文件。为了防止上传脚本需要设置对应的验证方式。最简单的就是设置文件后缀名验证。

  • 基于文件后缀名验证方式的分类:

    • 基于白名单验证:只针对白名单中有的后缀名,文件才能上传成功。
    • 基于黑名单验证:只针对黑名单中没有的后缀名,文件才能上传成功。

简单来说就是我将一个后缀名乱七八糟test.sfasdfklsd的文件进行上传,假如能够上传成功,说明该处设置了黑名单验证,如果不能上传成就说明该处设置了白名单验证。

2)基于黑名单验证代码分析

对于黑名单中的后缀名筛选。绕过黑名单可以通过寻找“漏网之鱼”,寻找某些可以被作为脚本执行同时也不在黑名单中。
在这里插入图片描述
我们可以使用Burpsuite绕过黑名单验证,利用Burpsuite工具截断HTTP请求,利用Intruder模块进行枚举后缀名,寻找黑名单中没有过滤的后缀名。

3).htaccess文件(针对Apache)

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

其中.htaccess文件对应的MIME-Type类型:
SetHandler application/x-httpd-php

设置当前目录所有文件都使用PHP解析,那么无论上传任何文件,只要文件内容符合PHP语言代码规范,就会被当作PHP执行。不符合则报错。

前提:Apache中允许使用 .htaccess 的配置文件(默认是开启的)
在Apache中如果需要启动 .htaccess,必须在http.conf中设置 AllowOverride
在这里插入图片描述

注意:.htaccess 的配置文件一般是无法在桌面上创建的,这时候就可以使用Burp抓包来直接修改上传文件的配置名。
在这里插入图片描述

4)大小写绕过

Windows系统下,对于文件名中的大小写不敏感。例如:test.php和TeSt.PHP是一样的。
Linux系统下,对于文件名中的大小写敏感。例如:test.php和 TesT.php就是不一样的。

5)user.ini文件绕过

  • 先上传一个.user.ini文件【用户自定义的配置文件】,内容为:
    auto_prepend_file=1.gif
  • 再上传一个1.gif文件,内容为木马;
  • 最后在浏览器访问一个在当前目录下的随意一个php文件(必须存在),就能间接的访问了该以1.gif命名的木马了。

注意:

  1. 这里在当前目录下必须存在php文件;
  2. 目标的php版本有要求,php要带nts版本;
  3. 允许上传 .ini 文件;

这里很多人会想,在真实环境岂不是很鸡肋,毕竟一个不允许上传php文件的路径怎么可能会存在php文件?这里其实我们可以直接使用burp把上传的路径给改了的,让它上传到一个有php文件的路径。

6)空格绕过

绕过原理:
Windows系统下,对于文件名中空格会被作为空处理,程序中的检测代码却不能自动删除空格。从而绕过黑名单。

7).号绕过

绕过原理
Windows系统下,文件后缀名最后一个点会被自动去除。

8)特殊符号绕过

绕过原理
Windows系统下,如果上传的文件名中test.php::$DATA会在服务器上生成一个test.php的文件,其中内容和所上传文件内容相同,并被解析。

例如:
在Windows系统下新建一个文件名为 1.php::$DATA的文件,查看效果。但是在Window下新建的文件名中包含特殊符号不能成功新建。
在这里插入图片描述

9)路径拼接绕过

绕过原理
在没有对上传的文件进行重命名的情况下,用户可以自定义文件名并在服务器中上传新建,就会造成对应的绕过黑名单。

例如:
用户新建 1.php.+空格+.
deldot删除最后一个点之后,不再进行删除,trim删除空格,那么最终上传的文件名为 1.php.。利用Windows自动去除最后一个点,导致成功上传1.php。

10)双写绕过

绕过原理
代码编写过程中,只对黑名单中的内容进行空替换,因为只替换一次所以造成双写绕过。

例如:
1.phphpp

4、白名单绕过(00截断)

00截断原理:
0x00是十六进制表示方法,是ascii码为0的字符,在有些函数处理时,会把这个字符当做结束符。

系统在对文件名的读取时,如果遇到0x00,就会认为读取已结束。

在PHP5.3之后的版本中完全修复了00截断。并且00截断受限与GPC,addslashes函数。

  1. GET型00截断
    GET型提交的内容会被自动进行URL解码。
  2. POST型00截断
    在POST请求中,%00不会被自动解码,需要在16进制中进行修改00.

5、文件包含漏洞绕过

在PHP中,使用includerequireinclude_oncerequire_once函数包含的文件都会被当作PHP代码执行,无论文件的名称是什么,只要符合文件内容符合PHP代码规范,都会被当作PHP代码执行。

利用存在文件包含的PHP页面,包含上传的图片木马,从而触发木马。

6、文件内容检测绕过

1) 文件幻数(文件头)检测绕过:

通过正则匹配判断文件幻数(文件头)内容是否符合要求,一般为白名单检测,常见的文件头(文件头标志位)如下:

  • .JPEG .JPE .JPG :“JPGGraphicFile”(FFD8FFFE00)
  • .gif:”GIF89A”(474946383961)
  • .zip:”ZipCompressed”(504B0304)
  • .doc .xls .xlt .ppt .apr:“MSCompoundDocumentv1orLotusApproachAPRfile”(D0CF11E0A1B11AE1)

一般是在木马文件头部插入对应的文件头内容,比如GIF89A等,伪装成图片马。
图片马制作方法:

  1. 直接在木马文件的头部添加GIF89A等字母;
  2. 直接在图片文件中添加payload(易造成图片损坏);
  3. 使用cmd命令,copy tupian.jpg /b + muma.php /a muma.jpg
  4. 使用edjpgcom等工具制作;

2) getimagesize()检测绕过

getimagesize()函数会读取目标文件的16进制,验证目标文件16进制的头几个字符串是否符合图片的要求,通过此函数判断文件类型。故可以使用图片马进行绕过。

源码:
在这里插入图片描述

3) exif_imagetype()检测绕过

exif_imagetype()函数是用来读取文件的第一个字节并检查其签名,即通过文件头判断文件类型。所以与getimagesize()函数检测一样,可使用图片马进行绕过。

7、竞争条件绕过

文件上传过程介绍
在这里插入图片描述

竞争条件原理介绍
网站逻辑:
网站允许上传任意文件,临时保存在服务器,然后检测上传的文件是否符合上传的条件,符合就重命名该文件并保存,不符合就删除。

在删除之前,访问上传的php文件,从而执行上传文件中的php代码。

简单来说就是,不断(大量)上传文件,同时也不断(大量)尝试请求访问该文件,利用时间差去赌服务器线程来不及删除文件然后成功访问并执行的可能性,从而实现先木马上传。

例如,上传文件代码如下:
<?php fputs(fopen('shell.php','w'),'<?php phpinfo(); ?>'); ?>
该代码是生成一个名叫shell.php的PHP文件,内容是一句话木马。

源码:
在这里插入图片描述

  • 上传逻辑
    1.通过 move_uploaded_file($temp_file, $upload_file)移动上传的文件;
    2.上传完毕后通过in_array($file_ext,$ext_arr)检查文件名后缀是否在白名单中;
    3.若后缀合法,则对文件进行重命名(rename),上传完成;
    4.若后缀非法,则删除文件。

8、脏字符绕过

脏字符参数填充的地方,from-data 后面 ,或者,内容脏字符绕,当然内容脏字符绕过还是需要考虑一下语言注释符常见如jsp<!–注释内容–> php /**/ ,当waf检测内容数据包过大时,可能会放行。

9、文件路径修改绕过

木马文件上传成功,但是不解析,看请求包是否存在有指定上传路径
在这里插入图片描述

利用../回溯,上传到根目录
在这里插入图片描述

成功链接木马
在这里插入图片描述

10、HPP漏洞绕过

1)HPP漏洞

HPP 是 HTTP Parameter Pollution 的缩写,意思即“ HTTP 参数污染 ”。这个漏洞由 S.di Paola 与 L. Caret Toni 在 2009 年的 OWASP 上首次公布。这也是一种注入型的漏洞,攻击者通过在HTTP请求中插入特定的参数来发起攻击。如果Web应用中存在这样的漏洞,可以被攻击者利用来进行客户端或者服务器端的攻击。通过 HPP 参数污染可以实现绕过 waf 来进行攻击。

2)漏洞原理

浏览器与服务器进行交互时,浏览器提交 GET/POST 请求参数,这些参数会以 “名称-值对” 的形式出现。通常在一个请求中,同样名称的参数只会出现一次,但是在 HTTP 协议中是允许同样名称的参数出现多次的

GET /foo?par1=val1&par2=val2 HTTP/1.1
User-Agent: Mozilla/5.0
Host: Host
Accept: */*

如上面的 HTTP 请求,在跟服务器交互的过程中,HTTP 协议允许 GET/POST 请求多次传同一参数值。

但是不同的服务器处理方式会不一样,比如必应搜索引擎,如果输入了两次查询参数q,第二次输入的参数值将覆盖第一次输入的参数值:
在这里插入图片描述

但是对于谷歌搜索引擎,则会将两次输入的参数值进行拼接而没有覆盖:
在这里插入图片描述
从上面可以看到,如果同时提供2个搜索的关键字参数给 Google,那么 Google 会对2个参数都进行查询;但是必应则不一样,它只会处理后面一个参数。服务列表

下面这个表简单列举了一些常见的 Web 服务器对同样名称的参数出现多次的处理方式:
在这里插入图片描述

3)漏洞利用

在HPP中最典型的的例子就是 “双文件上传” 。

1、如下例子,可以看到 filename 参数写了两次,可能绕过一些上传限制:
在这里插入图片描述

2、也可以尝试直接多加一个 filename(HPP):
在这里插入图片描述

3、或者直接多个 Content-Disposition:
在这里插入图片描述

4、同时可以上传一个正常图片文件+一个木马文件尝试绕过:

------61234564788
Content-Disposition: form-data; name="FileName"; filename=1.png”

图片内容 
------61234564788
Content-Disposition: form-data; name="FileName1"; filename=1.php”

木马内容
------61234564788--

八、防护措施

  • 检测的重点放在文件内容检测
  • 路径/扩展名检测一定要用白名单
  • 不能有本地文件包含漏洞
  • 随时注意更新Web应用软件

九、靶场演示

链接: 文件上传靶场upload-labs通关


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

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

相关文章

Session 反序列化漏洞

将$_SESSION中保存的所有数据序列化存储到PHPSESSID对应的文件中有三种存取格式&#xff1a; &#xff08;1&#xff09;默认使用php&#xff1a;键名|键值&#xff08;经过序列化函数处理的值&#xff09; name|s:6:"1FonlY"; &#xff08;2&#xff09;php_seri…

Multi-level Wavelet-CNN for Image Restoration论文总结

论文&#xff1a;Multi-level Wavelet-CNN for Image Restoration 源码&#xff1a;GitHub - lpj0/MWCNN: Multi-level Wavelet-CNN for Image Restoration 目录 一、背景和出发点 二、创新点 三、MWCNN具体实现 四、DWT与池化运算和膨胀卷积相关性证明 五、DWT、IWT代码实…

阿里云服务器白嫖教程

阿里云服务器白嫖教程 第一步:打开百度第二步:进入阿里云官方,注册登录账号第三步:点击免费试用第四步:点击立即试用第五步:选择操作系统第五步:选择到期释放设置![在这里插入图片描述](https://img-blog.csdnimg.cn/d02f4582dd5943319441df9ccbae60f0.png)第六步:同意协议,并立…

3D深度视觉与myCobot 320机械臂无序抓取

今天我记录使用myCobot320 M5跟FS820-E1深度相机进行一个无序抓取物体的分享。 为什么会选择深度相机和机械臂做一个案例呢&#xff1f; 2D相机&#xff08;最常见使用的相机&#xff09;可以捕捉二维图像&#xff0c;也就是在水平和垂直方向上的像素值。它们通常用于拍摄静态…

F#奇妙游(5):计算π的值

F#到底有什么用&#xff1f; 奇妙游写到第五篇&#xff0c;前面的几篇都是开场白&#xff1a; 一个用F#编写WinForm的例子donet命令行工具&#xff0c;也就是F#的开发环境关于函数和函数式编程的碎碎念函数式编程的核心概念&#xff1a;值 下面&#xff0c;我们开始正式来搞…

数据库左、右、内、逗号、全连接(mysql不包含全连接)方式

1、准备数据 学生有归属班级 学生表 班级表 2、执行查询语句 2.1执行左关联 select * from student stu left join class cla on (stu.class_idcla.class_id); 结果如下 2.2执行右关联 2.3、执行内连接 2.4执行逗号分隔表的连接方式 和内连接的查询结果是一样的

实训笔记7.3

实训笔记7.3 7.3一、座右铭二、单例模式三、IDEA集成开发环境的安装和基本使用四、Debug断点调试4.1 作用有两个4.2 用法&#xff1a;4.3 IDEA设置step into进入JDK源码4.4 step over4.5 step into 五、Java中的网络编程5.1 网络编程的三个核心要素5.2 通过Java实现网络编程 7.…

第三章 搜索与图论(二)——最短路问题

文章目录 单源最短路朴素Dijkstra堆优化版DijkstraBellman Ford算法SPFASPFA求负环 多源汇最短路Floyd 最短路练习题849. Dijkstra求最短路 I850. Dijkstra求最短路 II853. 有边数限制的最短路851. spfa求最短路852. spfa判断负环854. Floyd求最短路 源点表示起点&#xff0c;汇…

Linux系统远程挂载Mac OS系统目录方法

打开mac文件共享功能 开启共享服务 进入系统偏好设置中的共享选项。勾中文件共享&#xff08;如下图&#xff09;&#xff0c;之后右边的文件共享的绿灯会点亮&#xff0c;并显示“文件共享&#xff1a;打开”。 添加共享目录 点击在文件共享界面&#xff08;如下图&#x…

【狂神】MySQL - 数据库级别的外键

1. 外键 FOREIGN KEY (了解) 测试数据 &#xff1a; 学生表 CREATE TABLE IF NOT EXISTS student (id INT(4) NOT NULL AUTO_INCREMENT COMMENT 学号,name VARCHAR(30) NOT NULL DEFAULT 匿名 COMMENT 姓名,pwd VARCHAR(20) NOT NULL DEFAULT 123456 COMMENT 密码,sex VARC…

【数据结构与算法】 完成用十字链表存储的稀疏矩阵的加法运算

题目&#xff1a; Qestion: 完成用十字链表存储的稀疏矩阵的加法运算。 主要思路&#xff1a; 获取两个稀疏矩阵总有多少个非零元素&#xff0c;记作cnt。当cnt 不为零时一直循环&#xff0c;每循环一次i&#xff0c;也就是行循环&#xff0c;每循环一次就转移至下一行。先从…

Git常用指令总结

1、git init&#xff1a;初始化一个Git仓库&#xff1b; 2、git clone&#xff1a;从远程仓库克隆代码到本地&#xff1b; 直接使用网址 git clone <url>or 用a代替网址 git remote add a <url>git clone a3、git add&#xff1a;添加文件到暂存区&#xff1b; 文件…

K8S数据管理

K8S数据管理 1 数据管理1.1 数据持久化1.1.1 存储方案1.1.2 EmptyDir实践1.1.3 hostPath实践1.1.4 NFS实践 1.2 持久化进阶1.2.1 数据对象1.2.2 PV&PVC实践1.2.3 SC解析1.2.4 SC实践 1.3 配置管理1.3.1 配置基础1.3.2 CM1.3.3 CM案例1.3.4 Secret1.3.5 Secret案例 1.4 状态…

36. QT中使用QFtp实现文件传输1 -- 本地文件或文件夹上传到远程服务器

1. 说明 在使用QT进行嵌入式开发或者是使用到TCP控制传输时,有时程序的正常运行会用到某一个文件或者整个文件夹,此时就需要软件方面将需要的文件或者文件夹传输到远程服务器上。在QT中主要有两种方式可以实现这个功能,一个是QT4中使用QFtp这个类来实现,这个类提供了很丰富…

每天一点Python——day48

#第四十八天 #什么是元组为什么元组没有增删改操作和生成式&#xff1f; 元组&#xff1a;Python内置的数据结构之一&#xff0c;是一个不可变序列 不可变序列&#xff1a;没有增删改操作【例如字符串&#xff0c;元组】 可变序列&#xff1a;可以执行增删改操作&#xff0c;操…

记录好项目D21

记录好项目 你好呀&#xff0c;这里是我专门记录一下从某些地方收集起来的项目&#xff0c;对项目修改&#xff0c;进行添砖加瓦&#xff0c;变成自己的闪亮项目。修修补补也可以成为毕设哦 本次的项目是个基于Springbootvue的景区旅游系统 一、系统介绍 本项目分为管理员与…

534 · 打劫房屋 II

链接&#xff1a;LintCode 炼码 - ChatGPT&#xff01;更高效的学习体验&#xff01; 题解&#xff1a;九章算法 - 帮助更多程序员找到好工作&#xff0c;硅谷顶尖IT企业工程师实时在线授课为你传授面试技巧 处理循环数组问题&#xff1a;分类&#xff0c;重复&#xff0c;取反…

信息安全概述笔记

保密性、完整性、可用性是传统的信息安全的原则和目标&#xff0c;目前随着信息安全问题的日益严峻&#xff0c;信息安全的原则和目标衍生为诸如可控性、不可否认性等其他的原则和目标。 保密性&#xff08;Confidentiality&#xff09;:确保信息只能由那些被授权使用的人获取…

Web服务器群集:四层代理与七层代理

目录 一、理论 1.OSI七层模型 2.四层代理 3.七层代理 4.四层代理与七层代理区别 5.负载均衡器 6.常见的代理组件 7.应用场景 二、总结 一、理论 1.OSI七层模型 &#xff08;1&#xff09;概念 标准的七层网络分层是OSI七层模型&#xff0c;TCP/IP五层模型和TCP/IP四…

Android Matrix的理解

文章目录 前言一.基础1.1 Matrix1.2 使用Matrix的准备知识 二.preXXX和postXXX2.1 右乘和左乘2.2 验证规律 三.坐标原点结束 前言 Android绘制中最重要的要算Matrix类了&#xff0c;同时也是不太好理解的。以前也用过&#xff0c;但是掌握的也不是太好&#xff0c;刚好有时间好…