文件上传漏洞(基础)

痞子三分冷 提交于 2020-03-05 01:04:05

文件上传漏洞:

介绍:一般Web站点会有用户注册功能,而当用户登入之后大多数情况下都会存在类似头像上传、附件上传一类的功能,这些功能点往往存在上传验证方式不严格的安全缺陷,是在Web渗透中非常关键的突破口,只要经过仔细测试分析来绕过上传验证机制,往往会造成被攻击者直接上传Web后门,进而控制整个Web业务的控制权,复杂一点的情况是结合Web Server的解析漏洞来上传后门获取权限。

 

原理:由于文件上传功能实现代码没有严格限制用户上传的文件后缀以及文件类型,导致允许攻击者向某个可通过 Web 访问的目录上传任意PHP文件,并能够将这些文件传递给 PHP 解释器,就可以在远程服务器上执行任意PHP脚本。

 

成功攻击条件:

        1.可以上传任意脚本文件,且上传的文件能够被Web服务器解析执行,具体来说就是存放上传文件的目录要有执行脚本的权限。

        2.用户能够通过Web访问这个文件。如果文件上传后,不能通过Web访问,那么也不能成功实施攻击。

        3.知道文件上传到服务器后的存放路径和文件名称,因为许多Web应用都会修改上传文件的文件名称,那么这时就需要结合其他漏洞去获取到这些信息。如果不知道上传文件的存放路径和文件名称,即使你上传了也无法访问。

 

基本概念:

>shell与webshell:

1)SHELL:对服务器的某种操作权限

2)WEBSHELL:以ASP、PHP、JSP或者CGI等网页文件形式存在的一种命令执行环境,入侵者通过网站端口对网站服务器的某种程度上操作的权限。()

由于WEBSHELL大多是以动态脚本的形式出现,也有人称之为网站的后门工具。

3)WEBSHELL后门具有隐蔽性:一般隐藏在正常文件中并修改文件时间达到隐蔽目的,或者利用服务器漏洞进行隐藏。

4)WEBSHELL可以穿越服务器防火墙,由于与被控制的服务器或远程过80端口传递的,因此不会被防火墙拦截。并且使用WEBSHELL一般不会在系统日志中留下记录,只会在网站的WEB日志中留下一些数据提交记录。

>木马:

通过特定的程序(木马程序)来控制另一台计算机。木马通常有两个可执行程序:一个是控制端,另一个是被控制端

>一句话木马:

1)ASP一句话木马: <%execute(request("value"))%>

2)PHP一句话木马: <?php @eval($_POST[value]);?>

3)ASPX一句话木马:<%@ Page Language="Jscript"%>
                 
                 <%eval(Request.Item["value"])%>

4)JSP一句话木马:

<%if(request.getParameter("f")!=null)
(new    java.io.FileOutputStream(application.getRealPath("")+request.getParameter("f"))).write(request.getParameter("t").getBytes());
%>

 

文件上传漏洞检测点:

1)客户端JavaScript检测(通常为检测文件扩展名)

2)服务端MIME类型检测(检测Content——Type内容)

3)服务端目录路径检测(检测path参数相关的内容)

4)服务端文件扩展名检测(检测跟文件extension相关的内容)

5)服务端文件内容检测(检测内容是否合法或含有恶意代码)

1)客户端JavaScript检测:

检测方式:这类检测通常在上传页面里含有专门检测文件上传的JavaScript代码,最常见的就是检测扩展名是否合法。

绕过方式: >在前端的JavaScript代码中白名单中添加需要上传的文件后缀

                    >删除掉调用的验证文件后缀的函数

                    >用抓包工具将可以上传的文件格式修改为需要上传的文件格式

案例分析(1):

JavaScript检测文件类型功能函数:(分析:白名单验证后缀)

function checkFile() {
var file = document.getElementsByName('upfile')[0].value;
//定义允许上传的文件类型
var allow_ext = ".jpg|.jpeg|.png|.gif|.bmp|";
//提取上传文件的类型
var ext_name = file.substring(file.lastIndexOf("."));
//判断上传文件类型是否允许上传
if (allow_ext.indexOf(ext_name + "|") == -1)

绕过技巧:

1)禁用浏览器端的js功能
2)Firebug修改源代码           
3)BurpSuite抓包修改后缀名
4)本地表单提交

2)服务端MIME(Multipurpose Internet Mail Extensions)类型检测:(MIME:多用途互联网邮件扩展类型

MIME的作用 :Web浏览器通过MIME类型判断文件是GIF图片,还是可打印的PostScript文件。

Web客户端使用MIME来说明发送数据的种类, Web服务器使用MIME来说明希望接收到的数据种类。

检测方式 :MIME类型与文档的后缀相关,因此服务器可以使用文档的后缀来区分不同文件的MIME类型。服务器在发送真正的数

                     据之前,就要先发送标志数据的MIME类型的信息,这个信息使用Content-Type关键字进行定义

绕过方式 :用抓包工具将数据包信息中Content-Type关键字对应的文件格式进行修改。

案例分析(2)

检查上传文件的类型(Content-Type值):

if (
    (($_FILES["file"]["type"] == "image/gif")|| ($_FILES["file"]["type"] =="image/jpeg")|| ($_FILES["file"]["type"] == "image/pjpeg"))
)

绕过技巧:

Burpsuite抓包绕过,修改Content-Type的值为image/gif

3)目录路径检测:

检测方式: 

                   目录路径检测,一般就检测路径是否合法

绕过方法 :

                   用0x00进行截断

                 在路径中设置一个.php的文件,利用解析漏洞

案例分析(3):

检查path参数的合法性:

$uploaddir = $_POST['path'];
if (isset($_POST['submit']) && isset($uploaddir)) {
    if (!file_exists($uploaddir)) {
        mkdir($uploaddir);
    }
}

绕过技巧:

更改path变量的值为x.asp配合解析漏洞利用

4)服务文件扩展名检测:

分类:黑名单检测

             白名单检测

黑名单检测:黑名单的安全性比白名单的安全性低很多,攻击手法自然也比白名单多。一般有个专门的blacklist文件,里面会包含常见的危险脚本文件扩展名,例如下图为fckeditor2.4.3或之前版本的黑名单。

黑名单检测绕过:

1)文件名大小写绕过
      用像AsP, pHp之类的文件名绕过黑名单检测

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

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

4)0x00截断绕过 
      扩展名检测这一块目前只遇到过asp的程序有这种漏洞,比如,上传的文件名叫test.asp.jpg(asp后面为0x00),在gettype()函数里处理方式是从后往前扫描扩展名, 所以判断为jpg文件,但在保存文件时却是以0x00作为文件名截断,最后以test.asp存入路径里

5)htaccess文件攻击 配合名单列表绕过
      上传一个自定义的.htaccess,就可以轻松绕过各种检测

6)解析调用/漏洞绕过 
      这类漏洞直接配合上传一个代码注入过的非黑名单文件即可,再利用解析调用/漏洞

白名单检测:白名单检测只允许特定的文件扩展名才能上传,相对来说比黑名单安全一些,但也不见得就绝对安全。

白名单绕过:

1).0x00截断绕过 
      用像 test.asp%00.jpg的方式进行截断,属于白名单文件,再利用服务端代码的检测逻辑 漏洞进行攻击,目前我只遇到过 asp的程序有这种漏洞

2)解析调用/漏洞绕过 
      这类漏洞直接配合上传一个代码注入过的白名单文件即可,再利用解析调用漏洞

案例分析(4):

验证文件extension;黑名单验证

$ext= end(explode('.',$_FILES['file']['name']));
if(($ext!='php'&&$ext!='php3'&&$ext!='php5'&&$ext!='txt'&&$ext!='php4'&&$ext!='zip'&&$ext!='asp')&& ($_FILES["file"]["size"] < 200000)){

}

绕过技巧:

找到黑名单中的漏网之鱼 如:phtml并不在黑名单之中,上传1.phtml

5)服务端文件内容检测:

检测种类:

        文件幻数检测

        文件相关信息检测

        文件加载检测

>文件幻数检测:

文件幻数检测方法 :

        检测文件头,比如 :

                jpg文件的文件头为:FF D8 FF E0 00 10 4A 46 49 46

                gif文件的文件头为:47 49 46 38 39 61

                png文件的文件头为:89 50 4E 47

绕过方式 :

        在文件幻数后面加上自己的一句话木马代码就行

>文件相关信息检测:

文件相关信息检测方法

        图像文件相关信息检测常用的就是getimagesize()函数,只需要把文件头部分伪造好就ok了,就是在幻数的基础上加了一些文件信息

绕过方式 :

        在文件的首部加入 **GIF89a** 可绕过

>文件加载检测:

文件加载检测方法:

        一般是调用API或函数去进行文件加载测试。常用的是图像渲染测试,或者进行二次渲染

绕过方式:

        <对渲染/加载测试的攻击方式:

                代码注入绕过(在不破坏文件本身的渲染情况下找一个空白区进行填充代码,一般会是图片的注释区,对于渲染测试基本上都能绕过,毕竟本身的文件结构是完整的)

         <对二次渲染的攻击方式 :

                二次渲染即文件上传时会被渲染,下载回来后还会被重新渲染,常见方式是攻击文件加载器自身(常见的是溢出攻击),上传自己的恶意文件后,服务器上的文件加载器会主动进行加载测试,加载测试时被溢出攻击执行shellcode

案例分析(5):

preg_match("/^([\w\W]*)\?>([\w\W]*)$/",$content)

分析:preg_match函数通过正则表达式对文件内容进行了检测,若发现内容中存在?> 则认定为非法文件

绕过技巧:

利用PHP本身的特点,结尾处可以不用?>

文件内容为<?php eval($_POST[123]); 可直接绕过。

需要更改MIME类型为image/gif

文件上传漏洞解决方案:

1)检查是否判断了上传文件类型及后缀

2)定义上传文件类型白名单,即只允许上传的文件类型

3)文件上传目录禁止脚本解析

4)对上传后的文件使用随机数改名

说明:内容来源于成都信息工程大学信安教学ppt;仅供学习!

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!