Web安全之文件上传漏洞

1.客户端检测

1.1.概述

当用户在客户端选择文件点击上传的时候,客户端还没有向服务器发送任何消息,就对本地文件进行检测来
判断是否是可以上传的类型,这种方式称为前台脚本检测扩展名。

1.2.绕过方法

在本地浏览器客户端禁用JS:可使用火狐浏览器的Noscript插件、浏览器禁用JS等方式实现(快捷键浏览器先按F2再按F1,高级设置中勾选即可)。
Web安全之文件上传漏洞

2.MIME类型检测

2.1.概述

当浏览器在上传文件到服务器的时候,服务器对所上传文件的Content-Type类型进行检测,如果是允许的,
则可以正常上传,否则上传失败。

2.2.MIME类型

MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。用来表示文档、文件或字
节流的性质和格式。在http数据包中在Content-Type字段显示。
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
MPEG文件.mpg、.mpeg:video/mpeg
AVI文件.avi:video/x-msvideo

2.3.绕过方法

利用Burp Suite截取并修改数据包中的Content-Type字段的值为正常值从而进行绕过。

3.黑名单检测

3.1.概述

一般情况下,代码文件里会有一个数组或者列表,该数组或者列表里会包含一些非法的字符或者字符串,当
数据包中含有符合该列表的字符串时,即认定该数据包是非法的。
确认黑名单方法:
因为黑名单是不允许我们的数据包含有符合黑名单列表的字符串,所以我们只需要随意构造一个不在它列表
中的数据包即可。

3.2.绕过方法

3.2.1.利用后缀大小写不敏感绕过

在Windows中,大小写是不敏感的。
例如:“test.php” 和 “test.PHp访问结果是一样的。

3.2.2.利用空格绕过

在Windows中,文件保存的时候如果文件后缀名末尾有空格会自动去掉
例如:“test.php ”Windows会自动去掉末尾的空格变成"test.php"。

3.2.3.利用点号(·)绕过

在Windows中,文件保存的时候会自动去掉文件后缀后的点号。
例如:“test.php.”在保存的时候就变成了“test.php”。

3.2.4.利用(::$DATA)绕过

在Windows中如果文件名+“:: D A T A ” 会 把 : : DATA”会把:: DATA::DATA之后的数据当成文件流处理,不会检测后缀名,且保
持:: D A T A 之 前 的 文 件 名 。 例 如 : “ t e s t . p h p : : DATA之前的文件名。 例如:“test.php:: DATA:test.php::DATA”Windows会自动去掉末尾的::$DATA变成“test.php”。

3.2.5.利用双写后缀绕过

有些代码中,会将数据包中符合黑名单列表的字符串替换为空。
例如:“test.php”变为“test”,那么可以构造”test.pphphp“在保存的时候就变成了”test.php“。

3.2.6.利用.htaccess文件绕过

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

<FilesMatch "as.png"> setHandler application/x-httpd-php </FilesMatch>  

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

4.白名单检测

4.1.概述

一般情况下,代码文件里会有一个数组或者列表,该数组或者列表里会包含一些合法的字符或者字符串,当数据包中含有不符合该列表的字符串时,即认定该数据包是非法的。
确认白名单的方法
因为白名单是只允许我们的数据包含有符合白名单列表的字符串,所以我们只需要随意构造一个数据包,如果可以上传,说明是黑名单,不可以上传则是白名单。

4.2.绕过方法

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

4.2.1.利用%00截断绕过

原理:
%00是一个url编码,url发送到服务器后就被服务器解码,这时还没有传到验证函数,也就是说验证函数里接收到的不是%00字符,而是%00解码后的内容,即解码成了0x00。在url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束。
具体用法:
利用Burp Suite修改post请求头Url结尾处添加%00。

4.2.2.利用0x00截断绕过

原理:
系统在对文件名进行读取时,如果遇到0x00,就会认为读取已经结束。但要注意是文件的十六进制内容里的00,而不是文件名中的00。
具体用法:
利用Burp Suite在文件名后添加数据,再在Hex中将其修改为00将其截断。

5.文件内容检测

5.1.概述

主要有两种检测方法:
文件幻数检测:一般通过判断前10个字节,基本就能判断出一个文件的真实类型。
文件加载检测:一般是调用API或函数对文件进行加载测试。

5.2.文件幻数

5.2.1.概述

文件格式幻数(magic number),它可以用来标记文件或者协议的格式,很多文件都有幻数标志来表明该文件的格式。
常见的文件头:
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

5.2.2.绕过方法

  • 通过Burp Suite在请求包文件内容添加文件头
  • 制作图片马:
    1.使用16进制编辑器打开一个图片,在图片后面插入WebShell即可得到图片马
    2.在cmd下执行:copy a.jpg/b + test.php/a shell.jpg(a.jpg要足够小,test.php为一句话木马)也可以得到图片马。

5.3.文件加载

5.3.1.概述

图像渲染测试,再严格点的甚至是进行二次渲染。

5.3.2.绕过方法

用工具对文件空白数据区或注释区进行代码注入绕过(图像仅能绕过渲染测试,而不能绕过二次渲染)。

6.条件竞争绕过文件删除

6.1.概述

条件竞争指多个线程或者进程在读写一个共享数据时结果依赖于它们执行的相对时间的情形。
例如:两个进程P1和P2共享了变量a。在某一执行时刻,P1更新a为1,在另一时刻,P2更新a为2。因此两个任务竞争地写变量a。在这个例子中,竞争的“失败者”(最后更新的进程)决定了变量a的最终值。

6.2.绕过方法

大量发包绕过文件删除。
test.php内容:

<?php fputs(fopen('t.php','w'),'<?php eval($_REQUEST[a]);?>');?> 

上传"test.php’后通过Burp Suite爆破模块大量发包产生条件竞争在上传路径中生成"t.php"内容为:

<?php eval($_REQUEST[a]);?> 

其为一句话木马
然后通过访问t.php即可getshell

7.漏洞防御

1. 上传的目录设置为不可执行。只要web容器无法解析该目录下面的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响。
2. 对文件后缀的判断中使用白名单的方式。
3. 文件服务器和web服务器分离,也就是上传的文件单独存放到其他的服务器之中。
4. 不需要返回文件路径的情况下,随机改写文件名。

版权声明:玥玥 发表于 2021-08-23 2:51:11。
转载请注明:Web安全之文件上传漏洞 | 女黑客导航