LOADING

加载过慢请开启缓存 浏览器默认开启

2024/5/5

什么是文件上传漏洞

凡是存在文件上传的地方均有可能存在文件上传漏洞,有文件上传就可以测试漏洞;
指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。
文件上传漏洞的时候看对方的代码是否写的比较完整、安全,疏忽了验证就会造成文件上传漏洞;
有文件上传的功能就可以去测试;

在这里插入图片描述

在这里插入图片描述

文件上传漏洞如何查找及判断

1.黑盒查找

扫描敏感文件,获取上传地址;
根据网站给出的应用,进入到网站后台也可以文件上传;
首先找到文件上传的窗口,然后判断是服务器端还是客户端的验证,客户端较容易判断出来,最后检验是哪种服务器端的过滤方式。判断是客户端和服务端检验,再检验是白名单还是黑名单,根据具体情况来决定采用什么绕过方式。

2.白盒查找

从对方的源代码里来分析漏洞;

文件上传漏洞有哪些需要注意的地方
拿到一个文件上传,对文件上传的类型做一个区分;确定文件上传的类型,采取这样的类型来去做测试;

文件上传产生漏洞的原因

  1. 服务器配置不当
  2. 文件上传限制被绕过
  3. 开源编辑器的上传漏洞
  4. 文件解析漏洞导致文件执行
  5. 过滤不严或被绕过

文件上传检测方式

一般一个文件上传过程中的检测方式有:

客户端JavaScript检测(检测文件扩展名)
服务端MIME类型检测(检测content-type内容)
服务端目录路径检测(检测跟path参数相关的内容)
服务端文件扩展名检测 (检测跟文件extension相关的内容)
服务端文件内容检测(检测内容是否合法是否含有恶意代码)

Webshell

常用的一句话木马

php一句话木马: <?php @eval($_POST[value]);?>
asp一句话木马: <%eval request("value")%>
aspx一句话木马: <%@ Page Language="Jscript"%><%eval(Request.Item["value"])%>

制作图片马

copy 1.jpg/b+1.php/a 2.jpg

Webshell原理

以PHP一句话木马为例

<?php @eval($_POST['cmd']); ?>

php的代码要写在 里面,服务器才能认出来这是php代码,然后才去解析。

@ 符号的意思是不报错,因为变量没有定义而被使用,服务器会提醒XXX变量未定义。

$_POST['cmd']; 
php里面有几个超全局变量, $_GET、$_POST 就是其中之一,意思是用 post 的方法接收变量cmd传递来的字符。

eval()
把字符串作为PHP代码执行

system()
exec()
执行系统命令

文件上传绕过

绕过客户端检测(JS检测)

upload-labs 靶场第一关 chrome浏览器为例

关闭chrome 浏览器JS检测

在url地址栏输入:chrome://settings/content/javascript 添加需要关闭JS检测的网站

绕过服务端检测

服务端检测

服务端的代码通常检测三个点:MIME类型、文件内容、文件后缀

绕过MIME类型检测

常见MIME类型

超文本标记语言文本 .html         text/html
普通文本 .txt                     text/plain
PDF文档 .pdf                     application/pdf
Microsoft Word文件 .word         application/msword
PNG图像 .png                     image/png
GIF图形 .gif                     image/gif
JPEG图形 .jpeg,.jpg             image/jpeg
au声音文件 .au                     audio/basic
MPEG文件 .mpg,.mpeg             video/mpeg
AVI文件 .avi                     video/x-msvideo
GZIP文件 .gz                     application/x-gzip

原理:检测图片类型文件上传过程中http包的 Content-Type 字段的值,来判断上传文件是否合法。
方法:用burpsuite截取并修改数据包中文件的 content-type 类型进行绕过。

绕过文件后缀检测-黑名单

黑名单策略:
文件扩展名在黑名单中为不合法,一般有个专门的黑名单列表,里面会包含常见的危险脚本文件。

常见的绕过方法

1. 后缀大小写绕过:(.Php)
   在对后缀的判断中,如果只是对字符串进行单独的比较来判断是不是限制文件,可以采用后缀名大小写绕过形式。

2. 空格绕过:(.php  )
   如果黑名单没有对后缀名进行去空处理,可以通过在后缀名后加空进行绕过。

3. 点绕过:(.php.)
   如果黑名单没有对后缀名进行去.处理,利用Windows系统的文件名特性,会自动去掉后缀名最后的.,通过在文件名后加.进行绕过。

4. ::$DATA 绕过:
   如果黑名单没有对后缀名进行去::$DATA处理,利用Windows下NTFS文件系统的一个特性,可以在后缀名后加::$DATA,绕过对黑名单的检测。
   
5. 双写绕过(.pphphp)
    如果代码只是对php做一次删除,那么就可以时候pphphp来进行绕过,当检测到时,匹配的是中间的php,删除一次后变成php。
    
6. 配合Apache解析漏洞:
   Apache解析有一个特点,解析文件时是从右往左判断,如果为不可识别解析再往左判断,如
   aa.php.owf.rar文件,Apache不可识别解析‘.owf’和‘.rar’这两种后缀,会解析成.php文件。

7. .htaccess 文件
   配合名单列表绕过,上传一个自定义的.htaccess ,就可以轻松绕过各种检测
   .htaccess 文件(或者"分布式配置文件"),全称是Hypertext Access (超文本入口)。提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。
比如新建一个.htaccess 文件: 
<FilesMatch "png"> 
setHandler application/x-httpd-php 
</FilesMatch>

绕过文件后缀检测-白名单

白名单策略:文件扩展名不在白名单中为不合法。

绕过方法:服务端判断文件类型是从后往前判断,而对文件解析是从前往后解析,可以利用00截断的方式进行绕过,包括%00截断与0x00截断。 php小于5.3.29

%00截断:
url发送到服务器后被服务器解码,这时还没有传到验证函数,也就是说验证函数里接收到的不是%00字符,而是%00解码后的内容,即解码成了0x00。

0x00截断:
系统在对文件名进行读取时,如果遇到0x00,就会认为读取已经结束。但要注意是文件的十六进制内容里的00,而不是文件名中的00。

绕过文件内容检测

一般通过检测文件内容来判断上传文件是否合法。

主要有两种检测方法:

  1. 通过检测上传文件内容开始处的文件幻数来判断。
    通常情况下,通过判断前10个字节,基本就能判断出一个文件的真实类型。
  2. 文件加载检测
    一般是调用API或函数对文件进行加载测试。常见的是图像渲染测试,再严格点的甚至是进行二次渲染
文件幻数检测

主要是检测文件内容开始处的文件幻数

文件格式幻数(外语:magic number),它可以用来标记文件或者协议的格式,很多文件都有幻数标志来表明该文件的格式。

常见图片类型的文件幻数如下:

要绕过 jpg 文件幻数检测就要在文件开头写上下面的值:

Value = FF D8 FF E0 00 10 4A 46 49 46

要绕过 gif 文件幻数检测就要在文件开头写上下面的值:

Value = 47 49 46 38 39 61     可见字符:GIF89a

要绕过 png 文件幻数检测就要在文件开头写上下面的值:

Value = 89 50 4E 47
JPEG (jpg),文件头:`FFD8FF`  
PNG (png),文件头:`89504E47`  
GIF (gif),文件头:`47494638`  
HTML (html),文件头:`68746D6C3E`  
ZIP Archive (zip),文件头:`504B0304`  
RAR Archive (rar),文件头:`52617221`  
Adobe Acrobat (pdf),文件头:`255044462D312E`  
MS Word/Excel (xls.or.doc),文件头:`D0CF11E0`

然后在文件幻数后面加上自己的一句话木马代码就行了。

文件加载检测

一般是调用API 或函数去进行文件加载测试,我们常见的是图像渲染测试,严格的进行二次渲染。

对渲染/加载测试的攻击方式是代码注入绕过

对二次渲染的攻击方式是攻击文件加载器自身

1、对渲染/加载测试攻击 - 代码注入绕过
可以用图像处理软件对一张图片进行代码注入

这类攻击的原理是:在不破坏文件本身的渲染情况下找一个空白区进行填充代码,一般是图片的注释区,这样能保证本身文件结构是完整的,对于渲染测试基本上都能绕过

2、二次渲染的攻击方式 - 攻击文件加载器自身
这种情况下无法用代码注入绕过,二次渲染相当于把原本属于图像数据的部分抓出来,在用自己的API或函数进行重新渲染,而非图像数据部分直接被隔离开了。

我们可以用溢出攻击对文件加载器进行攻击,上传自己的恶意文件后,服务器上的文件加载器会主动进行加载测试,加载测试时被溢出攻击执行shellcode。

解析漏洞

Apache解析漏洞

形式: test.php.qwe.asd ,任意不属于Apache解析黑名单且也不属于白名单的名称

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

条件:apache通过mod_php来运行脚本,其2.4.0-2.4.29中存在apache换行解析漏洞,在解析php时 xxx.php\x0A 将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略

Nginx解析漏洞

形式: 任意文件名/任意文件名.php

一个在任意文件名后面添加 /任意文件名.php 的解析漏洞,比如原本文件名是 test.jpg ,可以添加为 test.jpg/x.php 进行解析攻击。

原理:Nginx < 0.8.37默认是以CGI的方式支持PHP解析的,普遍的做法是在Nginx配置文件中通过正则匹配设置 SCRIPT_FILENAME 。当访问www.xx.com/phpinfo.jpg/1.php 这个URL时, $fastcgi_script_name 会被设置为phpinfo.jpg/1.php ,然后构造成 SCRIPT_FILENAME 传递给PHP CGI,但是PHP为什么会接受这样的参数,并将phpinfo.jpg作为PHP文件解析呢?这就要说到 fix_pathinfo这个选项了。 如果开启了这个选项,那么就会触发在PHP中的如下逻辑: PHP会认为SCRIPT_FILENAME 是 phpinfo.jpg ,而 1.php 是 PATH_INFO ,所以就会将phpinfo.jpg 作为PHP文件来解析了

漏洞形式:
www.xxxx.com/UploadFiles/image/1.jpg/1.php
www.xxxx.com/UploadFiles/image/1.jpg.php
www.xxxx.com/UploadFiles/image/1.jpg/ \0.php

形式: 任意文件名%00.php

对低版本的 Nginx 可以在任意文件名后面添加 %00.php 进行解析攻击。(Nginx版本<=0.8.37空字节代码执行漏洞)

IIS 6.0解析漏洞

1、目录解析

形式: www.xxx.com/xx.asp/xx.jpg

原理: 服务器默认会把 .asp 目录下的文件都解析成asp文件。

https://www.cnblogs.com/milantgh/p/4347520.html

2、文件解析

形式: www.xxx.com/xx.asp;.jpg

原理:服务器默认不解析;号后面的内容,因此 xx.asp;.jpg 便被解析成asp文件了。

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

/test.asa
/test.cer
/test.cdx

IIS 7.0/7.5解析漏洞

形式: 任意文件名/任意文件名.php

原理:IIS7.0/7.5 是对 php 解析时有一个类似于 Nginx 的解析漏洞,对任意文件名只要在 URL后面追加上字符串 /任意文件名.php 就会按照 php 的方式去解析

由于php配置文件中,开启了 cgi.fix_pathinfo ,而这并不是nginx或者iis7.5本身的漏洞。

在这里插入图片描述

参考链接:

WEB安全基础-文件上传-CSDN博客

WEB安全文件上传_web 文件上传最安全的方式-CSDN博客