文件上传总结

简单的说 只要是存在文件上传的地方均有可能存在文件上传漏洞

漏洞原理

网站Web应用都有一些文件上传功能,比如文档、图片、头像、视频上传,当上传功能的实现代码没有严格校验上传文件的后缀和文件类型,此时攻击者就可以上传一个webshell到一个Web可访问的目录上,并将恶意文件传递给如PHP解释器去执行,之后就可以在服务器上执行恶意代码,进行数据库执行、服务器文件管理,服务器命令执行等恶意操作。还有一部分是攻击者通过Web服务器的解析漏洞来突破Web应用程序的防护。

文件上传漏洞原因分析:

无安全防护措施,可以直接上传脚本

漏洞原因:上传功能未考虑安全问题,可以任意上传*.asp、.aspx、.php、*.jsp等可执行的脚本文件,不需要任意的绕过就可以直接获取Web权限。

采用黑名单扩展名,导致过滤不严格

漏洞原因:上传文件判断文件扩展名时,采用了黑名单机制,只是禁止*.asp、.aspx、.php、.jsp这种已知的可执行文件扩展名,但没有限制.cer、.asa、.PHP、*.JSP这类扩展名,从而导致过滤不严格,形成上传漏洞。

仅通过客户端判断,存在绕过限制的漏洞

漏洞原因:上传文件判断文件类型时,通过客户端语言JavsScrip判断文件大小、类型和扩展名,上传白名单仅在JS中实现,而客户端过滤很容易通过工具绕过限制,达到攻击的目的。

上传设计未考虑解析器的安全,导致发生解析漏洞

漏洞原因:上传设计时使用了白名单机制,但允许用户控制上传文件的文件名和保存文件时上级文件夹的名称

第三方编辑器漏洞,例如FCK、eWebeditor

漏洞原因:很多产品使用了FCK、eWebeditor编辑器,方便富文件上传和管理,而这些编辑器版本较多,很多低版本本身就存在上传漏洞,因此也是上传漏洞的重灾区

Web容器配置漏洞,使用不安全HTTP方法实现上传攻击

漏洞原因:Web容器支撑PUT、MOVE、COPY等不安全的HTTP方法,但权限配置存在问题,导致攻击者可以通过PUT、COPY、MOVE上传脚本文件。

WEB中间件导致的文件上传漏洞

这和我们的代码没有直接的关系,他是另外一个层面上产生的文件上传漏洞,在搭建这一个文件上传服务的时候,这个服务器使用的版本本身存在漏洞,从而导致了文件上传漏洞。比如解析漏洞就是中间件漏洞它可以导致文件上传漏洞

利用场景

上传Web脚本程序,Web容器解释执行上传的恶意脚本

上传病毒、木马文件,诱骗用户和管理员下载执行

上传包含脚本的图片,某些浏览器的低级版本会执行该脚本,用于钓鱼和欺诈

注意 :在上传图片木马的时候 如果这个图片里面是php的代码 单纯的点击这个图片的连接地址是无法进行执行的 因为图片的格式和需要执行代码的文件格式不同 但是有的服务器会存在解析漏洞 只要在后面再加上一个子文件/后面加上你这个图片文件的后缀名 就能够执行这个文件里面的代码 例如在图片文件之后加上/1.php 这样就能执行文件中的php代码

利用思路

常规类

扫描获取上传

在你要进行测试的网站 如果没有发现可供测试 的端口 也就是没有可供文件上传的窗口 那么就可以通过工具扫描这个url 扫描出和这个url相关的文件上传的端口url 当然如果这个测试地址本来就不存在文件上传的端口 那么也是没用处的

会员中心上传

在一些网站的用户中心或者会员中心都会存在文件上传的地方 就类似于上传头像啊啥的 这些地方极易存在文件上传的漏洞

后台系统上传

网站的后台管理员 使用的后台可以进行一些文件上传操作的地方

各种途径上传

类似于注册用户 上传文章 分享图片的地方也极易存在上传漏洞

cms类

已知cms源码

在一些网站中 有的使用的cms源会存在一些已知的漏洞 如果知道这个漏洞 就可直接利用这个漏洞进行恶意文件的上传等

编辑器类

ckeditor

fckeditor

kindeditor

漏洞危害

文件上传是上传我们自己写的代码 自己的代码可以是在对方的数据库后台执行 那么就可以在对方建立一个后门webshell 常见的的就是通过文件上传建立网站后门 这样就可以直接获取到网站权限 这就属于高危漏洞 获取权限之后 就可以通过拿到的权限去获取一些数据库的账号和密码 数据的安全隐患极大 可以进行服务器的提权 获取到内网权限

验证方式

js验证/前端验证

一般当你上传不规范文件后缀名的文件时 都会有验证 过滤和提示 有前端验证或者称之为js过滤

php是一种后端代码 当你在浏览器返回的代码或者元素 和其在后端执行的代码时完全不一样的 而像html ,js代码则是在前端和后端返回的元素都是一样的 浏览器是吧其执行的结果给展现出来 前端和后端的区别就是这样 在浏览器中进行验证的就称之为前端验证 如果使用的时js代码进行验证的 还可以称之为js验证

如果是前端验证的话可以直接修改前端的源代码进行文件上传 去除关键过滤代码 这样就能进行绕过

后端验证:

后端验证区别与前端验证 就是代码不是直接在浏览器中执行 而是必须在后端的服务器中去执行 前端验证可以直接修改代码就能有不通的显示结果 但是后端验证则必须在放在服务器上进行运行 然后再返回给浏览器 这就是前端验证和后端验证最大的区别 在现在大多数的服务器都是采用的后端验证 这样更加的安全

后缀名

大部分的网站拦截脚本文件的上传 最直接的办法就是直接看文件的后缀名 这是最直接的 后缀名又分为黑名单和白名单

黑名单

就是明确不让上传的文件后缀名的文件比如说 asp php jsp aspx cgi war等 除了黑名单中所设置的不允许上传的文件外其他的后缀类型的文件都可以上传 但是在黑名单在定义后缀名不完整的情况下面 可以用其他的后缀名的格式来达到同样的效果 比如php5 phtml 等 阿帕奇服务器就可以 解析这样格式的php文件 但是前提是对方修改了阿帕奇服务器中的配置信息 能够解析这样的格式 大部分是支持这样的格式的

白名单

明确可以上传的文件的后缀名的文件 比如说 jpg png zip rar gif等 也就是除了这个名单中所记录的后缀名的文件外 其他的都不可以上传

白名单就类似于防火墙实行的严策略一样 相对于黑名单来说还是安全许多

文件类型

MIMX信息

MIME类型就是conctent-type的值 通过bp抓取数据包可以知道MIME的值的信息 这也是一种验证方式 在有些网站中就会有MIME的验证

这种验证也是很好进行绕过的 可以直接修改数据包的MIME的值就可以进行欺骗 这种验证是不严谨的 很容易就可以进行伪造

文件头

内容头信息

不同后缀的文件的头信息都不同 这样也是一种验证方式 这种验证也是很不严谨的 可以对文件头信息进行修改和伪造

防御方案/修复方案

要想写出一个较为安全的验证 最好把这四种验证全部用上 单个的验证都不是安全的 采取多个复合型的验证 可以提高安全度

后端验证(采用服务端验证模式)

不能采用前端进行验证 以为前端是可以在代码上做文章的 在用户的浏览器上就可以修改运行是不行的 这样验证方式很容易就会被破坏 所以尽量采取后端验证

后缀验证(基于黑名单白名单过滤)

MIME检测(基于上传自带类型进行检测)

内容检测(文件头完整性检测)

自带函数过滤(uploadlabs函数)

自定义函数过滤(fuction,check_file())

WAF防护产品(宝塔,云盾,安全公司产品等)

WAF绕过

数据溢出--防匹配

一般的服务器都会对你输入的数据有长度要求这时候你可以使用数据溢出来进行绕过,在你的文件名输入很多的垃圾字符或者在你文件名的前面输入垃圾字符。(content_disposition,filename等)

符号变异--防匹配

一般在抓取到的数据包中 可以看到有的属性或者标签有双引号或者双引号括住 这就是可以改动的字符 分号就是代表这个属性的值结束 在最后的标签或者属性那里没有分号 这就代表这这是结束了 这时候就可以在后面加个分号代表后面还有标签或者属性 然后再在后面加上一些干扰的符号 还可以把双引号改成单引号 当遇到这类问题可以猜想是不是只检测双引号不检测单引号呢 一般双引号或者单引号闭合 但是如果去掉最后的闭合的一个符合那就会有三种情况产生 第一是:把前面那个闭合的符号当作是文件的名 第二:匹配到正常的文件名 第三:什么也匹配不到 在这三种情况下 第三种就是成功的上传 绕过。还有就是它只匹配闭合符号里面的内容 这时候就可以去掉前面和后面的符号 有时候也是可以绕过 进行文件上传的 这就是符号变异进行绕过 因为只要是它检测到这个文件就会进行验证和拦截 只要它检测不到这个文件就拦截不了

数据截断--防匹配(%00,换行)

这是换行进行截断 它匹配到的字符就是.p/nh/np的文件后缀 这就成功进行了绕过 最终在服务器上保存的文件是.php的脚本文件

而%00进行截断和下面说的截断一样 使用%00.jpg 让其检测到的文件名的后缀是.jpg的格式 成功上传文件 但是最终保存的文件的的后缀是.php 这是因为后面的.jpg被%00所截断导致

重复数据--防匹配(参数多行)

匹配filename的属性或者值进行匹配 然后再验证过滤 这时候就可以写多个filename属性 这时候就可以进行绕过 这个原理就是填充多行或者多个参数 由于它总是会有一个长度限制 那么当它匹配到的文件后缀是符合要求的时候就不会对这个数据包进行拦截 但是最终上传的文件名是最后的一个filename中的文件名 这时候成功的上传了脚本文件
还可以借助原有的数据包自带的一些东西进行干扰来进行绕过 当服务器检测这个数据包的时候 匹配filename的值 发现其中的值和一个数据包的值一样 而且这里面.php 后缀没有属性赋值 那么就会对这个数据包进行放行 不会拦截这个数据包 但是最终在服务器上保存的数据是.php的后缀名 这就成功的上传了脚本文件

绕过网站验证手段

通常百分之90的文件上传的地方都不会允许脚本格式的文件上传 可以利用常规类的突破去测试文件上传漏洞 在文件上传的地方假如可以上传图片文件就可以通过在图片中写入脚本代码 然后通过一些技术手段就可以让这段脚本进行执行 这也是一种绕过的技术手段 , 假若这样还是无法进行测试或者说还是无法进行绕过 那么可以看看这个服务器使用的是什么服务器版本 看这个服务器版本是不是存在已知的解析漏洞 通过这个漏洞再进行突破

前端关键代码删除绕过

当这个文件上传采用的是前端检测时 可以使用本地的工具对前端的代码直接进行修改 比如直接删除那段文件过滤的代码 就可以直接进行上传 那样就直接进行绕过检测 成功上传非法文件

使用bp进行抓包

可以使用bp进行数据包的抓取 直接在抓取的数据包中进行修改文件的后缀名 这样就直接进行了上传的操作 但是有的时候是抓取不到数据包的因为如果其提交的方式直接是js提交上去的话 那么不需要进行数据包在前后端的交互 所以抓取不到数据包 这样的话仅仅只是提交是抓取不到数据包的 当你保存到后端的时候 发生了提交保存后前后端的数据交互 就会抓取到数据包 抓取到数据包之后 可以看到其上传的文件格式是什么 然后直接进行修改 利用其中的模块工具进行发送过去查看效果 这样就之接绕过了过滤 文件上传成功 按理说在文件上传之后会返回一个文件的地址 但是有时候没有文件地址的回显 而且浏览器进行报错 这样就导致认为其没有文件上传漏洞 其实并不是 文件其实还是上传成功了 只是还是被前端提示文件上传失败 但假如知道cms源码 那么就可以查这个cms源码的已知漏洞 按照操作直接进行文件上传操作

上传其他格式的后缀名文件

有的服务器 像阿帕奇服务器 支持解析php3 php5 phtml 的后缀形式的文件 这样也可以直接达到绕过过滤 进行文件上传 前提是对方管理员没有关掉其中的一些配置文件 但是在有些网站的的过滤中会集中的在黑名单中写很多的后缀格式 也就是过滤掉蛮多的后缀格式在阿帕奇服务器搭建的服务器中可以有一个文件形式的绕过手段 。 .htaccess 这个后缀形式的文件是生成伪静态网页的配置文件 可以利用这个文件去进行绕过 例如在这个文件中写入如下代码:

<FilesMatch "shana">

Setmandler application/x.httpd.php

< /FilesMatch>

这段代码的意思是将文件名中包含shana的文件当作php进行解析 操作是先上传个文件再上传一个带有木马的代码的图片或者其他 前提是文件名中一定要包含shana 然后再访问你上传的木马文件的地址进行执行

大小写绕过

在一些网页的配置文件中 尽管其很多的后缀名都被加入到了黑名单中进行过滤 但是会存在有的地方没有进行大小写的转换 这时候就可以进行大小写的绕过 把要上传的文件的后缀名进行大小写进行绕过

空格绕过

在windows平台中 在文件的后缀名后面添加空格 在你再次打开这个文件的时候会自动清楚掉文件后缀名后的空格 但是在数据包的后缀名的尾部添加空格是不会自动清除的,如果网站的配置文件中没有收尾去空的过滤 这时候就可以进行空格绕过 先上传文件 用bp进行抓包 在抓取的数据包中在文件的后缀名的地方添加空格再发送过去 就会上传成功

在文件名后面添加点进行绕过

点的作用和空格的作用相同 在windows 等系统中在文件的后缀名后面添加点 会自动清楚掉这个点 如果网站的配置文件中没有进行末尾点的过滤 那么就可以使用bp进行抓包 在数据包名的末尾加入一个点然后进行发送就可以进行绕过 文件上传成功

::$DATA绕过

在windows平台而且必须是php的文件 在文件后缀名加上::$DATA 会把::$DATA之后的数据当成文件流处理 也就不会对这个之前的文件名的后缀进行检查 而且保持这个之前的文件后缀名 这就绕过了过滤 文件上传成功

一次过滤绕过

根据一般网站编辑者的编码习惯 一般都只进行一次过滤 不管是去空格还是去关键字去点都只是一次过滤 我们可以抓取到数据包之后在文件的末尾多添加几个空格 或者点来进行绕过 这样文件就上传成功一般在网站的过滤规则中如果只是进行一次过滤 那么可以进行多种方式的绕过 比如:aaa.pphphp 这个文件的后缀名是.pphphp 不在文件的黑名单中 上传成功 然后根据规则会把其中的php关键字进行去除 但是去除关键字php之后 其前面和后面的组合还是php 这时候不会再发什么这个规则的二次过滤 当访问这个文件的地址的时候就会当作php后缀类型的文件进行执行

%00截断绕过

这是基于白名单进行过滤的绕过方式 区别于0x00 这是对后面的字符或者后缀进行截断处理 当你上传1.php%00的文件时 如果采用的是白名单的验证方式 配置文件自动在后面补上后缀.jpg或者其他 这时候提交成功 这时候%00的作用就体现出来了 那就是后面服务器补上的.jpg无效 而且提交进去的是.php的文件 这时候就上传脚本文件成功 %00是建立在地址信息后面的一个情况 需要注意的一个点是在文件的提交方式是post是或者不是get方式提交的时候要对%00进行编码处理 因为get会自动解码 post不会自动解码

0x00截断绕过

类似于%00

条件竞争绕过/二次渲染绕过

这是编写者在进行源代码编辑时的一个逻辑漏洞,在第一次编写的时候,仅仅只是接收了文件还没有进行验证等文件上传成功之后会进行查看里面的文件,然后再对文件进行判断和验证,这时候让他第一次上传文件成功到第二次验证,其中的时间很短,这时候就可以通过条件竞争来进行绕过。我们可以使用BP等工具来进行我介绍过比方说,我不断地bp给服务器发包发一样的包找到数据包之后我们就在另一个浏览器上访问这个上传的文件地址,我们这里看到我们上传的文件已经到达了服务器 在检查这个文件漏洞的时候一定要判断是不是有二次渲染 使用这种方法进行绕过,一般有一个很明显的特征,就是那你上传一个图片文件时会有一个浓缩的图像,然后你选择保存还是删除二次渲染的验证,如果是在第二步那么就会存在漏洞。

控制文件名方式绕过

在有的地方会有控制文件名进行绕过的操作,比如说你上传一个文件,然后它会自动生成一个文件夹,你这个文件夹的形式去保存你的文件,这时候就可以使用BP抓取数据包改文件名的后缀,如果进行的是黑名单验证。就可以用%00进行截断 然后后面加上合法的文件后缀还可以使用/.这样的方式进行绕过在你改变了文件名的后缀之后,加上这俩个符号打开会自动保存你;前面的文件把这个文件的后缀就是你篡改的文件名后缀,比如说php./

逻辑数组验证绕过

用数组最近绕过这种方法在现实中很难实现,因为你无法看到对方的后台源代码,你需要去进行盲注 ,对方的验证,如果是数组验证和文件名相结合的验证。到时候你就可以伪造文件后缀名就行,绕过。使用BP进行抓取数据包,然后判断对方的的数组名。然后对数组名进行盲注。一般这种是使用的是白名单。

配合解析漏洞的文件上传漏洞

IIS

首先比较常见的是客户网站使用的IIS环境来搭建的,一般是IIS+PHP+Mysql数据库组合,或者是

IIS+aspx+sql2005数据库,IIS存在解析漏洞,当创建文件名为.php的时候,在这个目录下的所有

文件,或者代码,都会以PHP脚本的权限去运行,比如其中一个客户网站,可以将上传的目录改

为1.php,那么我们上传的jpg文件到这个目录下,访问的网址是/1.php/1.jpg

从浏览器里访问这个地址,就会是php脚本的权限运行。当上传网站木马webshell过去,就会直

接拿到网站的管理权限。存在IIS解析漏洞的版本是5.0-6.0版本。

apache

apache也是目前使用较多的一个服务器环境,尤其php网站使用的较多,因为稳定,快速,易于

PHP访问,可以将第三方的一些开发语言编译到网站中,apache也是存在漏洞的,尤其在apach

e1.0-2.0版本中,后缀名判断这里没有做详细的规定,导致可以绕过apache安全机制,上传恶意

的文件名。默认是允许多个后缀名进行解析的,如果命名的后缀名不被apache认可解析,就会向

前寻找后缀名,直到后缀名是apache认可的,就会直接解析成功。 该文件上传漏洞使用的条件

是需要开启module模式,不是这个模式的上传不了

Nginx

nginx是静态访问,以及大并发,能够承载多人访问,目前很多网站都在使用的一种服务器环境

,简单来讲就是HTTP访问的代理,高速稳定,深受很多网站运营者的喜欢,在nginx最低版本

中存在解析漏洞,可以导致运行PHP脚本文件,漏洞产生的原因是由于php.ini配置文件与nginx

配合解析的时候,将默认的后缀名认为是最重的文件名,导致可以修改后缀名来执行PHP文件。直接在后面输入/1.php,就会导致图片文件以php脚本权限来运运行

1 Like