文件上传漏洞学习笔记

  先来看看文件上传漏洞的定义:由于程序员未对上传的文件进行严格的验证和过滤,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。这种攻击方式是最为直接和有效的,“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。

  文件上传是大部分web应用都具备的功能,本身是正常的。上传的文件检测方法一般是俩种:

    客户端检测:客户端使用JavaScript检测,在文件未上传时,就对文件进行验证;

    服务器端检测:服务端脚本一般会检测文件的MIME类型,检测文件扩展名是否合法,

       甚至有些程序员检测文件中是否嵌入恶意代码。

  下面开始文件上传漏洞测试:针对客户端检测漏洞

    测试环境:虚拟机win7   工具:Xshell
         owasp靶机      burpsuite

         prrot Linux       中国菜刀

准备:开启owasp靶机,Xshell连接,win7访问owasp靶机页面

 

进入Damn Vulnerable Web Application页面:登入 u:admin p:admin

owasp提供许多漏洞,这里我们选择upload

 

先不急着上传,首先先设置DVWA Security,owasp可以查看后端JavaScript源码,便于学习

设置安全级别为low,查看后端代码: 

    

 

 可以看到low安全模式下没有对上传文件进行任何限制

我们可以上传正常的图片等文件,也可以上传一行代码<?php @eval($_POST['hacker']);?>,保存为.php的文件,这样我们就可以进入网站后台随意操作(这里大家可以去网上了解一下中国菜刀和中国蚁剑的用法)

我们上传下面俩个文件

 

 

 上传后可以在owasp上查看

 

 菜刀连接网站

 

 我们便可以为所欲为了[滑稽]

增加一点难度,将安全级别调为medium;查看后端源码:

 

 可以看到它对上传文件的MINE类型和大小进行了限制(什么是MINE类型可以查看https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types

先将之前上传的文件删除

 

 

 上传正常的.jpg文件可行,上传.php文件⑧彳亍,原因是HTTP post报文中提交的MINE类型与规定的不一致:Content-Type: application/octet-stream 而不是image/jpeg

 

 

 

 

办法是通过抓包,更改包中的Content-Type信息,再转发出去,欺骗服务器。

打开firefox的网络设置,开启代理。如图:(192.168.243.130:8080是burp suite所在机的ip)

 

在burp suite上的配置:

 

 配置好了之后开始上传:左上角可以看到一直是加载状态,等待服务器回应

 

在burpsuite上可以看到捕获的包:

 

 之后点击Forward,在上传页面就可以看到:

 

 查看服务器里的文件

 

 打开菜刀:

可以进行多种操作

 

 

再将安全级别调为高级;查看后端源码:

(屏幕太小截不完,凑合着看)

 

 

 可以看出是对文件的后缀进行了限制。

那我们可以改下后缀上传或者该post包中的文件名

先试试这俩种方法,再post包中改名:

 

 

 

 上传成功

 

 查看服务器文件

 

 已经变成了shell.jpg了,网页查看和菜刀连接:失败

 

 直接该文件也是同上。这个时候该怎么办,我们可以通过木马或者其他手段进行攻击,具体可以去看下篇:https://www.cnblogs.com/luliblog/p/13398166.html

或者其他大佬的文章,方法有很多,学无止境。

能力有限接下来就不多说了,防御手段介绍几个常见的

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

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

 

2.判断文件类型

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

 

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

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

 

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

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

 

5.限制上传文件大小

限制上传文件的大小,防止由于内存、磁盘耗尽造成的拒绝服务。

可以配置web server允许的最大Post大小。

可以在代码层面获取上传文件的大小,根据文件类型的不同进行进一步的过滤。

 

6.确保上传文件被访问正确返回

1.将文件上传目录设置为静态资源目录,防止被解析为脚本执行。

2.使用代理页面隐藏文件真实路径。

3.使用上述方法时,确保Content-Type与实际文件类型一致。

4.如果文件不允许在页面展示,仅允许下载,请设置Content-disposition:attachment。

 

 部分内容摘自:https://blog.csdn.net/qq_42636435/article/details/88096844

 

 

posted @ 2020-07-28 16:11  lulii  阅读(549)  评论(0)    收藏  举报