• 文件操作安全之-文件上传原理篇


    本节将详细的解释一下文件上传安全相关内容,作为我的专栏《WEB安全原理和多种防御方法解读》中的一节。

    WEB网站的功能中,会经常涉及文件的增删改查等各种操作,具体的像文件上传,文件读取,文件修改以及文件删除等。除此之外,WEB中关于文件的操作还有文件包含,目录穿越等等。本章节将首先介绍一下文件上传中的安全问题。

    文件上传是WEB网站中常见的功能,比如网站都是有上传头像的功能,写微博,写博客可以上传图片等等,图1即CSDN的图片上传功能:
    在这里插入图片描述
    图1

    文件上传之漏洞原理

    对于WEB类型中的文件上传多数采用的是协议RFC1867进行实现,如图2所示:

    在这里插入图片描述

    该文档是对HTTP协议的扩展,以满足在HTML网页中上传文件。也有些应用使用HTTP的PUT方法进行文件上传,详见HTTP的协议RFC2616,如下图3:
    在这里插入图片描述

    图3
    文件上传漏洞往往指的是没有对上传的文件类型和内容进行控制,会导致利用上传的恶意文件进行非授权的操作。

    最为经典的利用场景为在上传的位置上传一个可执行的木马文件,这种行为通常不会立即导致问题,但是如果可以通过某种方式远程执行该文件,将会导致该机器被恶意程序控制。文件上传最常见的针对的是WEB类型的服务器,所以通常攻击者上传的是一个webshell类型的文件。由于WEB本身的特性,可以正向访问该WEBSHELL,建立连接,从而控制该机器。

    文件上传之漏洞举例

    应该来说文件上传的漏洞曾经是非常的普遍,但是随着框架的普及以及安全意识的提升,没有任何过滤所导致的文件上传漏洞越来越少。但是绝大多数的程序员的安全编码意识仍然不够,目前文件上传漏洞的防护还是依赖于一些框架所提供的的一些机制,因此框架本身处理不当将会导致比较严重的后果。目前来看,文件上传安全的原因更多的集中在一些框架细微之处的疏忽。下面介绍几个影响比较大的文件上传漏洞

    CVE-2011-2202

    该漏洞是PHP5.3.7之前的版本在解析HTTP请求中的filename时候,对于filename处理不当,导致通过构造绝对filename路径实现文件的上传,如下图4 NVD中的介绍:
    在这里插入图片描述
    图4
    可以看到漏洞的源码为PHP的main/rfc1867.c文件,即前述RFC1867协议的具体实现。由于该漏洞是PHP本身的漏洞,因此可以说影响所有使用PHP解析文件上传的网站。尽管NVD的评分并不是很高,但是个人认为该漏洞从影响面,PHP的流程程度,以及文件上传导致的后果来看,是一个非常严重的漏洞。下面根据NVD提供的patch以及exp进一步的分析该漏洞,相应的链接如下图5:
    在这里插入图片描述
    图5
    其中exp(该漏洞的利用程序)如图6所示:
    在这里插入图片描述

    图6
    图中exp表明只要在filename使用绝对路径,即以正斜杠开头的路径即可绕过,实现绝对路径的上传绕过。对比漏洞patch内容,如下图7:
    在这里插入图片描述
    图7
    对比补丁来看,修复的版本只是在指针对比的时候多了一个等于的判断,其根本的原因在于图8:
    在这里插入图片描述
    图8
    上图在未修复的版本中,s的取值在绝对路径的情况下,例如/home/webapp,等于filename的值,因此在存在漏洞版本的中会直接使用filename 的值进行文件的写入。程序员的本意是取文件名,而非路径名,存储在指定的目录。

    CVE-2020-17518

    该漏洞在apache flink1.5.1至1.11.3版本中解析HTTP请求中的filename时候,没有对filename进行正确的处理,导致通过相对的filename路径实现文件的上传,如下图9 NVD中的介绍:

    在这里插入图片描述
    图9
    由于apache flink为开源的项目,去到图9中对应的commit查看当时修复该漏洞的源码记录,这里,如图10:
    在这里插入图片描述
    图10
    通过图10中的修复注释可以看到,在存在漏洞的版本中对于上传的文件名称没有进行过滤,直接使用fileUpload.getFilename(),导致存在相对路径绕过问题。而在修复的版本中使用了File类去除相对的路径信息。对应的EXP如下如11所示:

    在这里插入图片描述
    图11
    对比如11中的相对路径以及图9中的源码,是很容易理解该漏洞的成因的,同时建议使用vulhub中的环境自行的验证,加深对于该漏洞的理解。由于apache flink的本意是将上传的文件存储在固定的目录,现在通过相对路径出现了绕过,因此会造成任意文件上传。

    一般意义上我们讨论文件上传,通常指的是WEB类型的文件上传,但是在一些非WEB类的服务中,也是存在文件上传漏洞的,例如CVE-2010-2729,这类漏洞分析起来难度稍微有点大,感兴趣的可以看一看。

    文件上传之潜在危害

    前面从原理和示例两份方面针对文件上传进行了简单阐述,文件上传会导致哪些后果呢。应该来说不同具体的漏洞影响程度是不一样的。有的文件上传漏洞由于限制了文件类型,影响较小,有的没有限制,则影响较大。下面列举文件上传漏洞潜在的危害:

    • 上传脚本类文件,例如php,asp,jsp,如果存在这些可执行脚本的文件上传,则可以正向连接上传的脚本,从而建立webshell的连接,控制目标机器,拿到WEB用户的权限。
    • 上传html类等静态文件,虽然这种类型的文件不会向脚本类型的webshell直接产生较大的影响。但是如果静态文件包含跳转钓鱼网站,利用目标服务器域名的合法性,通过里利用上传文件的URL地址,诱导点击,传播钓鱼网站,间接产生影响。
    • 上传可执行文件,一般为木马文件。但是在没有权限的情况下,无法执行该木马。因此这类上传的目的一般是诱导下载,传播木马等等。

    本文为CSDN村中少年原创文章,未经允许不得转载,博主链接这里

  • 相关阅读:
    LeetCode8-字符串转换整数(atoi)
    NET Core使用Grpc通信(一):一元请求
    【源码】Vue.js 官方脚手架 create-vue 是怎么实现的?
    深入了解HarmonyOS(鸿蒙操作系统)
    linux下tomcat怎么部署war包
    【Spring】Spring MVC 程序开发
    腾讯云服务器4核8G配置有哪些?多少钱一年?
    C语言编程题(二)运算符与位运算符优先级
    84-MongoDB高级介绍
    【vue3】传送组件、Teleport
  • 原文地址:https://blog.csdn.net/javajiawei/article/details/126808965