本节将详细的解释一下文件上传安全相关内容,作为我的专栏《WEB安全原理和多种防御方法解读》中的一节。
WEB网站的功能中,会经常涉及文件的增删改查等各种操作,具体的像文件上传,文件读取,文件修改以及文件删除等。除此之外,WEB中关于文件的操作还有文件包含,目录穿越等等。本章节将首先介绍一下文件上传中的安全问题。
文件上传是WEB网站中常见的功能,比如网站都是有上传头像的功能,写微博,写博客可以上传图片等等,图1即CSDN的图片上传功能:
图1
对于WEB类型中的文件上传多数采用的是协议RFC1867进行实现,如图2所示:
该文档是对HTTP协议的扩展,以满足在HTML网页中上传文件。也有些应用使用HTTP的PUT方法进行文件上传,详见HTTP的协议RFC2616,如下图3:
图3
文件上传漏洞往往指的是没有对上传的文件类型和内容进行控制,会导致利用上传的恶意文件进行非授权的操作。
最为经典的利用场景为在上传的位置上传一个可执行的木马文件,这种行为通常不会立即导致问题,但是如果可以通过某种方式远程执行该文件,将会导致该机器被恶意程序控制。文件上传最常见的针对的是WEB类型的服务器,所以通常攻击者上传的是一个webshell类型的文件。由于WEB本身的特性,可以正向访问该WEBSHELL,建立连接,从而控制该机器。
应该来说文件上传的漏洞曾经是非常的普遍,但是随着框架的普及以及安全意识的提升,没有任何过滤所导致的文件上传漏洞越来越少。但是绝大多数的程序员的安全编码意识仍然不够,目前文件上传漏洞的防护还是依赖于一些框架所提供的的一些机制,因此框架本身处理不当将会导致比较严重的后果。目前来看,文件上传安全的原因更多的集中在一些框架细微之处的疏忽。下面介绍几个影响比较大的文件上传漏洞
该漏洞是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 的值进行文件的写入。程序员的本意是取文件名,而非路径名,存储在指定的目录。
该漏洞在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,这类漏洞分析起来难度稍微有点大,感兴趣的可以看一看。
前面从原理和示例两份方面针对文件上传进行了简单阐述,文件上传会导致哪些后果呢。应该来说不同具体的漏洞影响程度是不一样的。有的文件上传漏洞由于限制了文件类型,影响较小,有的没有限制,则影响较大。下面列举文件上传漏洞潜在的危害:
本文为CSDN村中少年原创文章,未经允许不得转载,博主链接这里。