文件上传和文件解析漏洞
slug
series-status
status
summary
date
series
type
password
icon
tags
category
文件上传和文件解析漏洞
一、文件上传漏洞简介
文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。这种攻击方式是最为直接和有效的,“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。
文件上传漏洞本身就是一个危害巨大的漏洞,WebShell更是将这种漏洞的利用无限扩大。大多数的上传漏洞被利用后攻击者都会留下WebShell以方便后续进入系统。攻击者在受影响系统放置或者插入WebShell后,可通过该WebShell更轻松,更隐蔽的在服务中为所欲为。
二、文件上传漏洞原理
在文件上传的功能处,若服务端脚本语言未对上传的文件进行严格验证和过滤,导致恶意用户上传恶意的脚本文件时,就有可能获取执行服务端命令的能力,这就是文件上传漏洞。
文件上传漏洞对Web应用来说是一种非常严重的漏洞。一般情况下,Web应用都会允许用户上传一些文件,如头像、附件等信息,如果Web应用没有对用户上传的文件进行有效的检查过滤,那么恶意用户就会上传一句话木马等Webshell,从而达到控制Web网站的目的。

三、文件上传漏洞高危触发点
存在文件上传功能的地方都有可能存在文件上传漏洞,比如相册、头像上传,视频、照片分享。论坛发帖和邮箱等可以上传附件的地方也是上传漏阔的高危地带,另外像文件管理器这样的功能也有可能被攻击者所利用。
值得注意的是,如果移动端也存在类似的操作的话,那么相同的原理,也存在文件上传漏洞的风险。

四、前端检测:
主要是通过javascript代码进行检测,非常容易进行绕过。
1. 原理:
Web应用系统虽然对用户上传的文件进行了校验,但是校验是通过前端javascript代码完成的。由于恶意用户可以对前端javascript进行修改或者是通过抓包软件篡改上传的文件,就会导致基于js的校验很容易被绕过。

2. 如何判断当前页面使用前端is的验证方式:
前端验证通过以后,表单成功提交后会通过浏览器发出─条网络请求,但是如果前端验证不成功,则不会发出这项网络请求;可以在浏览器的网络元素中查看是否发出了网络请求。
3. 绕过方法:
- 删除或者禁用js:
火狐浏览器-->about:config-->JavaScriptenable-false (ajax)
- 使用代理上传文件,Burp Suite;上传符合要求的文件类型,抓包修改文件类型。
3.1 删除js绕过:
直接删除代码中onsubmit事件中关于文件上传时验证上传文件的相关代码即可:

或者可以不加载所有js,还可以将html源码copy一份到本地,然后对相应代码进行修改,本地提交即可。
五、后端检测_后缀名检测漏洞:
1. 原理:
通常是针对文件的扩展名后缀进行检测,主要是通过黑白名单进行过滤检测,如果不符全过滤规则则不允许上传。

2. 黑名单:
2.1 原理:
黑名单检测:一般有个专门的 blacklist 文件,里面会包含常见的危险脚本文件。 例如: fckeditor 2.4.3 或之前版本的黑名单:

2.2 绕过方法:
解析漏洞
.htaccess
文件解析漏洞- apache解析漏洞
- IIS7.0 | IIS7.5 | Nginx的解析漏洞
- IIS6.0解析漏洞
截断上传
- 截断类型:PHP%00截断
- 截断原理:由于00代表结束符,所以会把00后面的所有字符都截断
- 截断条件:PHP版本小于5.3.4,PHP的magic_quotes_gpc为OFF状态
大小写绕过
比如:aSp和pHp之类。
黑名单扩展名的漏网之鱼
比如: asa和cer之类 asp: asa cer aspx jsp: jspx jspf php: php php3 php4 php5 phtml pht exe: exee
利用Windows的命名机制
shell.php. shell.php空格 shell.php:1.jpg shell. php::$DATA shell.php:1.jpg 在windows中,后缀名后面的点和空格都会被删除掉。
双写绕过
有时候在检测时,后台会把敏感字符替换成空格,这个时候,我们可以使用双写进行绕过。比如:pphphp
3. 白名单:
3.1 原理:
白名单检测:一般有个专门的 whitelist 文件,里面会包含的正常文件:Jpg png GIF
3.2 绕过方法:
解析漏洞
- .htaccess文件解析漏洞
- apache解析漏洞
- IIS7.0 | IIS7.5 | Nginx的解析漏洞
- IIS6.0解析漏洞
截断上传
- 截断类型:PHP%00截断
- 截断原理:由于00代表结束符,所以会把00后面的所有字符都截断
- 截断条件:PHP版本小于5.3.4,PHP的magic_quotes_gpc为OFF状态
六、后端检测_00截断:
1. 原理:
虽然web应用做了校验,但是由于文件上传后的**路径用户可以控制,攻击者可以利用手动添加字符串标识符0X00的方式来将后面的拼接的内容进行截断,导致后面的内容无效,而且后面的内容又可以帮助我们绕过黑白名单的检测。
2. 绕过思路:
在C语言中,空字符有一个特殊含义,代表字符串的拼接结束。这里我们使用的是php语言
,属于高级语言,底层靠C语言
来实现的,也就是说空字符
的字符串拼接结束功能在PHP
中也能实现。但是我们在URL中不能直接使用空
,这样会造成无法识别;我们通过查看ASCII对照表
,发现ASCII对照表
第一个就空字符
,它对应的16进制是00
,这里我们就可以用16进制的00
来代替空字符
,让它截断
后面的内容。
使用
burpsuite
进行抓包,因为这里是通过URL
进行传递的文件上传后存储路径,所以需要对16进制
的00
进行URL编码
,编码的结果就是%00
,通过这种方式,就可以%00
截断后面的内容,让拼接的文件名不再进行生效:
七、后端检测_MIME检测:
1. 什么是MIME:
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。
绕过上传限制-服务端绕过MIME检测:

2. 常见的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动画) application/octet-stream (二进制数据) application/pdf (PDF文档)
3. 检测方式:
在文件上传过程中,服务端会针对我们的上传的文件生成一个数组,这个数组其中有一项就是这个文件的类型file_type;服务端对文件进行检测时,就是通过检测脚本中的黑白名单和这个数组中的file_type进行对比,如果符合要求就允许上传这个文件。

4. MIME绕过的原理:
部分Web应用系统判定文件类型是通过content-type字段,黑客可以通过抓包,将content-type字段改为常见的图片类型,如image/gif,从而绕过校验。
八、后端检测_文件头检测漏洞:
1. 原理:
在每一个文件(包括图片,视频或其他的非ASCII文件)的开头(十六进制表示)实际上都有一片区域来显示这个文件的实际用法,这就是文件头标志。我们可以通过16进制编辑器打开文件,添加服务器允许的文件头以绕过检测。
2. 常见的文件头:
注意:下面的文件头的格式是
16进制
的格式:GIF:
47 49 46 38 39 61
png:89 50 4E 47 0D 0A 1A 0A
JPG:FF D8 FF E0 00 10 4A 46 49 46
在进行
文件头绕过
时,我们可以把上面的文件头
添加到我们的一句话木马内容最前面,达到绕过文件头检测的目的。九、后端检测_内容检测图片马绕过:
1. 漏洞原理:
一般文件内容验证使用getimagesize函数检测,会判断文件是否是一个有效的文件图片,如果是,则允许上传,否则的话不允许上传。本实验就是将一句话木马插入到一个[合法]的图片文件当中,然后用webshell管理工具进行远程连接。
2. 图片马制作:
准备一张图片,这里为
a.png
,和一个一句话木马,通过以下命令合成一个图片马3.php
: a.php
内容:复制

- 命令:
复制

注:这条命令的意思是:通过
copy命令
,把a.png
图片文件,以二进制文件形式添加到a.php
文件中,以ASCII文本文件
形式输出为3.php
文件。3. 解析图片马:
一般解析图片马需要结合解析漏洞或者文件包含才能解析图片马;
十、解析漏洞:
1. .htaccess
文件解析漏洞:
1.1 漏洞利用前提::
web具体应用没有禁止.htaccess文件的上传,同时web服务器提供商允许用户上传自定义的.htaccess文件。
1.2 原理:
.htaccess文件(或者"分布式配置文件") ,全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法,即,在一个特定的文档目录中放置一个包含一个或多个指令的文件,以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。
1.3 利用方式:
上传覆盖.htaccess文件,重写解析规则,将上传的带有脚本马的图片以脚本方式解析。
1.4 .htaccess文件
内容:
.htaccess文件解析规则的增加,是可以按照组合的方式去做的,不过具体得自己多测试。
2. ***
Apache
解析漏洞:
2.1 漏洞原理:
Apache 解析文件的规则是从右到左开始判断解析,如果后缀名为不可识别文件解析,就再往左判断。比如test.php.a.b的“.a”和“.b”这两种后缀是apache不可识别解析,apache就会把test.php.a.b解析成test.php。
2.2 影响版本:
apache 1.x apache 2.2.x
3. ***
IIS6.0
解析漏洞:
IIS6.0解析漏洞分两种: 1、目录解析: 以xx.asp命名的文件夹里的文件都将会被当成ASP文件执行。 2、文件解析: xx.asp;.jpg 像这种畸形文件名在;后面的直接被忽略,也就是说当成xx.asp文件执行。
IIS6.0
默认的可执行文件除了asp
还包含这三种 .asa
.cer
.cdx
。4. IIS7.0 | IIS7.5 | Nginx的解析漏洞:
4.1 原理:
Nginx拿到文件路径(更专业的说法是URI)/test.jpg/test.php后,一看后缀是.php,便认为该文件是php文件,转交给php去处理。php一看/test.jpg/test.php不存在,便删去最后的/test.php,又看/test.jpg存在,便把/test.jpg当成要执行的文件了,又因为后缀为.jpg,php认为这不是php文件,于是返回Access denied。 这其中涉及到php的一个选项:cgi.fix_pathinfo,该值默认为1,表示开启。开启这一选项PHP可以对文件路径进行修理。
举个例子,当php遇到文件路径/1.jpg/2.txt/3.php时,若/1.jpg/2.txt/3.php不存在,则会去掉最后的/3.php,然后判断/1.jpg/2.txt是否存在,若存在,则把/1.jpg/2.txt当做文件/1.jpg/2.txt/3.php,若/1.jpg/2.txt仍不存在,则继续去掉/2.txt,以此类推。
4.2 漏洞形式:
4.3 另外两种解析漏洞:
十一、条件竞争漏洞:
条件竞争漏洞是一种服务器端的漏洞,由于服务器端在处理不同用户的请求时是并发进行的,因此,如果并发处理不当或相关操作逻辑顺序设计的不合理时,将会导致此类问题的发生。
上传文件源代码里没有校验上传的文件,文件直接上传,上传成功后才进行判断:如果文件格式符合要求,则重命名,如果文件格式不符合要求,将文件删除。
由于服务器并发处理(同时)多个请求,假如
a用户
上传了木马文件,由于代码执行需要时间,在此过程中b用户
访问了a用户
上传的文件,会有以下三种情况:1.访问时间点在上传成功之前,没有此文件。
2.访问时间点在刚上传成功但还没有进行判断,该文件存在。
3.访问时间点在判断之后,文件被删除,没有此文件。
十二、二次渲染漏洞:
1. 二次渲染原理:
在我们上传文件后,网站会对图片进行二次处理(格式、尺寸要求等),服务器会把里面的内容进行替换更新,处理完成后,根据我们原有的图片生成一个新的图片并放到网站对应的标签进行显示。
2. 绕过:
1、配合文件包含漏洞: 将一句话木马插入到网站二次处理后的图片中,也就是把一句话插入图片在二次渲染后会保留的那部分数据里,确保不会在二次处理时删除掉。这样二次渲染后的图片中就存在了一句话,在配合文件包含漏洞获取webshell。2、可以配合条件竞争: 这里二次渲染的逻辑存在漏洞,先将文件上传,之后再判断,符合就保存,不符合删除,可利用条件竞争来进行爆破上传
3. 如何判断图片是否进行了二次处理?
对比要上传图片与上传后的图片大小,使用**16进制编辑器打开图片查看上传后保留了哪些数据,查看那些数据被改变。
防御
系统运行时的防御
1、文件上传的目录设置为不可执行。只要web容器无法解析该目录下面的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响。
2、判断文件类型。在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。在文件类型检查中,强烈推荐白名单方式,黑名单的方式已经无数次被证明是不可靠的。此外,对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的HTML代码。
3、使用随机数改写文件名和文件路径。文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问。如果应用了随机数改写了文件名和路径,将极大地增加攻击的成本。再来就是像shell.php.rar.rar和crossdomain.xml这种文件,都将因为重命名而无法攻击。
4、单独设置文件服务器的域名。由于浏览器同源策略的关系,一系列客户端攻击将失效,比如上传crossdomain.xml、上传包含Javascript的XSS利用等问题将得到解决。
5、使用安全设备防御。文件上传攻击的本质就是将恶意文件或者脚本上传到服务器,专业的安全设备防御此类漏洞主要是通过对漏洞的上传利用行为和恶意文件的上传过程进行检测。恶意文件千变万化,隐藏手法也不断推陈出新,对普通的系统管理员来说可以通过部署安全设备来帮助防御。
Loading...