freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

文件上传漏洞详解
2021-06-03 22:59:58

免责声明

该文章仅用于信息防御技术的交流和学习,请勿用于其他用途
在未得到网站授权前提下,禁止对政府、事业单位、企业或其他单位网站及系统进行渗透测试;技术是把双刃剑,请遵纪守法,做一名合格的白帽子安全专家,为国家的网络安全事业做出贡献;

简介:

在文件上传的功能处,若服务端脚本语言未对上传的文件进行严格验证和过滤,导致恶意用户上传恶意的脚本文件时,就有可能获取执行服务端命令的能力,这就是文件上传漏洞。​文件上传漏洞对Web应用来说是一种非常严重的漏洞。一般情况下,Web应用都会允许用户上传一些文件,如头像、附件等信息,如果Web应该没有对用户上传的文件进行有效的检查过滤,那么恶意用户就会上传一句话木马等webshell,从而达到控制web网站的目的。

高危出发点:

相册、头像上传视频、照片分享附件上传(论坛发帖、邮箱)文件管理器

成因

image-20210527143954250

文件上传流程及原理

前端表单

<html><body>

Filename:

</body></html>

image-20210527213404238

文件上传校验方式

image-20210527144458886

前后端分:

1、客户端

2、服务端服务端细分:

1、检查后缀、白名单和黑名单

2、检查内容、文件头、大小等

3、其他

前端过滤JS代码

image-20210527214640322

后端过滤代码

image-20210527214723760

后端过滤一般用到的函数

1、trim()去除字符串两边的空格
2、deldot()删除文件名末尾的点号
3、strrchr()反向截取字符串
4、strtolower()转化为小写
5、str_ireplace()替换字符串中的内容
6、substr()获取子字符串
7、strrpos()获取字符串的位置信息
8、fopen()打开文件
9、fread()读取文件
10、unpack()函数从二进制字符串对数据进行解包

前端校验

1、检测原理

如果浏览器页面没有刷新、或打开burp抓包没有抓到包、或者通过查看前端HTML代码等方式验证证明前端JS验证。

2、绕过方法

简单粗暴通过删除其HTML代码对应的JS代码即可。

服务端--MIME类型检测绕过

1、检测原理

当用户上传文件到服务器端的时候,服务器端的程序会获取上传文件的MIME类型,然后用这个获取到的类型来和期望的MIME类型进行匹配,如果匹配不上则说明上传的文件不合法。​服务端检测MIME类型的代码如下:image-20210527220154794

2、什么是MIME

image-20210527152250346

3、绕过方法

因为服务端检测的是文件的MIME类型,而对这个MIME类型的值的获取是通过HTTP请求字段里的Content-Type字段,所以绕过的方法就是通过修改Content-Type的值,比如修改为image/jpeg;image/png;image/gif等等允许上传类型对应的MIME值;

服务端--黑名单绕过

1、检测原理

服务器程序根据一份文件后缀名名单来判断是否允许当前文件上传到服务器,只要上传的文件的类型能够和黑名单里面的类型匹配,那么就禁止该文件上传image-20210527220819584

2、绕过方法

①文件名大小写绕过用像AsP、PhP之类的文件名绕过黑名单检测

②名单列表绕过用黑名单里没有的名单进行攻击,比如黑名单里没有asa或cer之类

③特殊文件名绕过比如发送的http包里把文件名改成test.asp. 或test.asp_(下划线为空格),这种命名方式在Windows系统里是不被允许的,所以需要在burp之类里进行修改,然后绕过验证后,会被Windows系统自动去掉后面的点和空格,但是主要Unix/Linux系统没有这个特性。

服务端--.htaccess绕过

黑名单里拒绝了几乎所有有问题的后缀名,除了.htaccess;前提条件httpd.conf的两个开关设置要求:(1.mod_rewrite模块开启。2.AllowOverride All)

第一步:先上传一个.htaccess文件(该目录的所有文件可以php文件执行),内容如下:SetHandler application/x-httpd-php

第二步:然后再上传一句话木马(后缀名修改为jpg)

服务端--大小写绕过

1、检测原理

后端过滤函数中不包括,$file_ext = strtolower($life_ext);//转换为小写且所有后缀名过滤都过滤

2、绕过方法

修改后缀名为大写

服务端--空格绕过

1、检测原理

后端过滤函数中不包含,$file_ext = trim($file_ext);//首尾去空且所有后缀名过滤都过滤

2、绕过方法

修改后缀名增加空格

服务端--点绕过

1、检测原理

后端过滤函数中不包括,$file_name = deldot($file_name);//删除文件名末尾的点且所有后缀名过滤都过滤,利用Windows特性,会自动去掉后缀名中最后的“ . ”,可在后缀名中加“ . ”绕过。

2、绕过方法

修改后缀名中增加 . 号

服务端-- ::$DATA绕过

1、检测原理

后端过滤函数中不包括,$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA,后端没有对后缀名中的‘::$DATA’进行过滤,在php+windows的情况下,如果文件名+“::$DATA”会把::$DATA之后的数据当成文件流处理,不会检测后缀名. 且保持"::$DATA"之前的文件

2、绕过方法

利用Windows特性,可在后缀名中加“::$DATA”绕过

服务端--点+空格+点绕过

1、检测原理

保存文件的时候没有重命名而使用原始的文件名,导致可以利用1.php. .(点+空格+点)来绕过,条件比较苛刻

2、绕过方法

修改后缀,利用 1.php. . (点+空格+点)来绕过

服务端--双写绕过

1、检测原理

后端处理函数中包含了 str_ireplace($deny_ext,“”,$file_name);

2、绕过方法

把后缀名更改为pphphp

服务端--00截断

1、检测原理

后端采用白名单判断,但图片的路径是直接拼接出,例如:$img_path = $_GET['save_path']."/".rand(10,99).date("YmdHis").".".$file_ext;

2、绕过方法

可以利用%00截断绕过(传入save_path参数时加上);但是有条件截断条件:php版本小于5.3.4,php的magic_quotes_gpc为OFF状态

0x00是十六进制表示方法,是ascii码为0的字符,在有些函数处理时,会把这个字符当作结束符,而%00,是url对ascii编码再加%处理,url反编码后一样。

服务端--图片马绕过

1、检测原理

通过读写文件的前2个字节判断文件类型

2、绕过方法

上传图片马

getimagesize()-图片马

1、检测原理

通过getimagesizi获取图片文件的类型

2、绕过方法

上传图片马即可

exif_imagetype()-图片马

1、检测原理

获取图片中文件的类型

2、绕过方法

需要开启php的配置文件的php_exif模块,上传图片马

服务端--二次渲染绕过

1、检测原理

文件上传成功后,经过二次渲染,所谓二次渲染就是重新在生成一次图片,容易把图片马中的PHP代码修改掉。

2、绕过方法

php代码不能放在最后,对于不同的图片,修改的位置还不一样。

服务端--条件竞争

1、检测原理

条件竞争,先将文件上传到服务器,然后判断文件后缀是否在白名单里,如果在则重命名,否则删除,因此可以上传1.php只需要在它删除之前访问即可,可以利用burp的intruder模块不断上传,然后我们不断的访问刷新该地址即可;目的就是在文件还存在时执行一段php代码,比如新建一个文件,写入一句话。

代码:file_put_contents('webshell.php','<?php @eval($_POST[pass]); ?>');

文件上传漏洞防御

文件上传的目录设置为不可执行

只要web容器无法解析该目录下面的文件,即使攻击者上传了脚本文件,服务器本身也不会收到影响,因此这一点至关重要。

判断文件类型

在判断文件类型时,可以结合使用MIME Type、后缀检查等方式,在文件类型检查中,强烈推荐白名单方式,黑名单的方式已经无数次被证明是不可靠的,此外,对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的HTML代码。

使用随机数改写成文件名和文件路径

文件上传如果需要执行代码,则需要用户能够访问到这个文件,在某些环境中,用户能上传,但不能访问,如果应用了随机数改写了文件名和路径,将极大的增加攻击成本,再来就是像shell.php.rar.rar和crossdomain.xml这种文件,都将因为重命名而无法攻击。

单独设置文件服务器的域名

由于浏览器同源策略的关系,一系列客户端攻击将无效,比如上传crossdomain.xml、上传包含Javascript的XSS利用等问题都将得到解决。

使用安全设备防御

文件上传攻击的本质就是将恶意文件或者脚本上传到服务器,专业的安全设备防御此类漏洞主要是通过对漏洞的上传利用行为和恶意文件的上传过程进行检测,恶意文件千变万化,隐藏手法也不断推陈出新,对于普通的系统管理员来说可以通过部署安全设备来帮助防御。

# 渗透测试 # 文件上传
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录