本文最后更新于 2024-07-26,文章内容可能已经过时。

文件上传漏洞

免责声明

⚠特别说明:此教程为纯技术教学!严禁利用本教程所提到的漏洞和技术进行非法攻击,本教程的目的仅仅作为学习,决不是为那些怀有不良动机的人提供技术支持!也不承担因为技术被滥用所产生的连带责任!⚠

1.文件上传基础:

什么是文件上传:

将客户端数据以文件形式封装,通过网络协议发送到服务器端,在服务器端解析数据,最终在服务器端硬盘上作为真实的文件保存。
image-20240103162619668

通常一个文件以HTTP协议进行上传时,将POST请求发送到web服务器,web服务器收到请求并同意后,用户与web服务器将建立链接,并传输数据。

2.文件上传产生漏洞的原因:

1.服务器配置不当

2.文件上传限制被绕过

3.开源编辑器的上传漏洞

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

5.过滤不严或者被绕过

3.文件上传漏洞的危害:

上传文件的时候,如果服务器脚本语言未对上传的文件进行严格的验证和过滤,就容易造成上传任意文件的情况。

攻击者通过上传恶意文件(如php木马)传递给解释器去执行,然后就可以在服务器上执行恶意代码,进行数据库执行,服务器文件管理,命令执行等恶意操作。从而控制整个网站,甚至是服务器,这个恶意的文件(php,asp,aspx,jsp等),又被成为webshell

4.可能存在漏洞的位置

1.图片上传功能

2.头像上传功能

3.文档上传功能

这一类的功能,往往都可能会存在上传文件验证不严格的安全缺陷。

5.文件上传的检测方式:

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

客户端JavaScript检测(检测文件扩展名)

服务端MIME类型检测(检测content-type内容)
image-20240103163822802

服务端目录路径检测(检测跟文件extension相关内容)

服务端文件内容检测(检测内容是否合法是否含有恶意代码)等、

6.文件上传绕过:

image-20240103163956012

01.绕过客户端检测:

原理:通常是在上传页面中含有专门检测文件上传的JavaScript代码,最常见的就是检测文件类型和扩展名是否合法。

**方法:**在本地浏览器客户端禁用JS即可,可使用火狐浏览器的NOscript插件,IE中禁用js等方式实现。

02.绕过服务端的检测:

服务端检测:

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

image-20240103165622699

image-20240103165711857

03.绕过MIME类型的检测:

原理:检测图片类型文件上传过程中HTTP包的Content-Type字段的值,来判断上传文件是否合法

绕过方法:用burpsuite截取抓包并修改数据包中文件的content-type类型值进行绕过。
image-2024010316595049

04.绕过文件后缀检测—黑名单

黑名单策略:

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

image-20240103170149110

绕过方法:

1、后缀大小写绕过:(.Php)

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

2、空格绕过:(.php )

如果黑名单没有对后缀名进行去空格处理,可以通过在后缀名加空格的方式进行绕过

3、点绕过:(.php.)

如果黑名单没有对后缀名进行去点处理,利用windows系统的文件名特性,会自动去掉后缀名最后的点,通过在文件名后面加一个点的方法进行绕过

4、::$DATA绕过:

如果黑名单没有对后缀名进行去::$DATA处理,利用windows下NTFS文件系统的一个特性,可以在后缀名后加::$DATA,绕过黑名单的检测。

5、配合Apache解析漏洞:

Apache解析有一个特点,解析文件是从右往左判断,如果为不可识别解析再继续往左判断,如aa.php.owsf.rar文件,Apache会判断为不可识别解析,’.owf’和’.rar‘这两个后缀,会解析成.php文件

6、 .htaccess文件

配合名单列表绕过,上传一个自定义的.htaccess,就可以轻松绕过各种检测。

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

列如:

新建一个.htaccess文件:(as.png是要上传的文件)

<FilesMatch “as.png”>
SetHandler application/x-httpd-php
</FileMatch>

通过一个.htaccess文件调用php的解析去解析一个文件名中只要包含“haha”这个字符串的任意文件,所以无论文件名是什么样子,只要包含“haha”这个字符串。都可以被以php的方式解析到,一个自定义的.htaccess文件就可以以各种各样的方式去绕过很多上传验证机制。

05.绕过文件后缀名-----白名单

白名单策略:

文件扩展名不在白名单中为不合法,

绕过方式:

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

%00截断:

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

0x00截断:

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

06.绕过文件内容检测:

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

主要有两种检测方法:

1.通过检测上传文件内容开始处的文件幻数来判断。

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

image-20240103182309828

通常情况下,通过判断前10个字节,基本就能判断出一个文件的真实类型。

2.文件加载检测:

一般是调用API或函数对文件进行加载测试,常见的是图像渲染测试,在严格点的甚至是进行二次渲染。