文件操作安全之-文件读取原理篇

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

本文所讨论主要是本地的文件读取相关漏洞。文件读取功能是WEB应用中常见的功能,通常处理步骤如下:

  1. 客户端向服务端发起文件读取的请求
  2. 服务端一般会查找读取该文件
  3. 将该文件送给指定的解析器进行解析
  4. 返回解析之后的内容

文件读取之漏洞原理

从源代码的角度看文件读取漏洞,必然避不开前面几篇文章中提到的文件包含,文件解析以及目录穿越等问题。与前面几章不同的是,文件包含,文件解析,目录穿越更多是按照引起一类漏洞的原因来进行命名和分类。而文件读取描述的是某一类漏洞导致的结果,前面文章所提到的三种类型的漏洞均可能导致文件读取的结果。你可能会联想到导致文件读取结果的漏洞还包括命令执行等注入,xxe,SQL注入等。但是对于像命令执行这种漏洞,相比于文件读取,shell的建立才是该种类型漏洞最为关注。也就是说一个漏洞导致的后果有很多,描述这个文件后果的时候一般指的是其最为常见和严重的后果。因此回到导致文件读取上,从结果推原因来看,文件读取漏洞指的是那些漏洞所导致的最严重的的后果为文件读取,从这个角度上讲,我们称这一类的漏洞为文件读取漏洞,当然其原因可能是目录穿越之类的。

WEB安全的分类没有特别明确和统一的标准,最常见的是按照漏洞导致的原因分类,比如前面几篇文章所提到的文件上传,文件解析,文件包含,目录穿越等等。但是我们也经常听到文件读取这一类的漏洞,这是按照漏洞所导致的最严重的后果来分类的,由于历史上这类漏洞也非常的多,因此值得单独拿出来进行讨论。前面也提到,命令执行导致最严重的的后果一般不会是文件读取,因此这类的漏洞一般不算作导致文件读取漏洞的原因,除此之外,常见的导致文件读取漏洞的原因如下:

目录穿越
在前面的文章,这里,可以看出目录穿越的确最常见的后果是任意文件的读取。而文件读取的漏洞也的确有很多是和目录穿越相关的。但是值得注意的是目录穿越最为严重的后果并不一定是任意文件读取,在之前的文章中漏洞CVE-2021-41773也可以导致命令执行。

配置错误
为了扩展框架或者功能的灵活性,一般来说软件都会对外提供配置供开发者和使用者灵活的进行使用。还是那句老生常谈的话,运维人员和开发人员多数不具备安全知识和攻防视角,不经意间的配置可能会导致诸如任意文件读取的漏洞。一般来说框架的开发者默认使用者使用了正确的配置,因此配置导致的问题一般不会被框架或者软件开发者所认同,也很难被CVE进行收录。

软连接
如果在WEB服务器上可以创建软连接文件,对于该软连接的请求实际上是在请求其连接到的真实文件。设想这样一个场景,通过文件上传一个软连接文件,然后通过正常的WEB文件访问功能访问该软连接文件,则可以读取其指向的文件内容。当然实际利用不会那么顺利,就算文件上传位置可以通过文件后缀等黑白名单的检查,但是文件存储的位置,能够具备访问权限是未知的。本文将在后面通过漏洞CVE-2016-9086详细说明软链接所导致的任意文件读取问题
XXE
XML外部实体漏洞最常见的利用就是,读取诸如/etc/passwd等敏感信息,如下图1:
在这里插入图片描述
图1
关于XXE的漏洞,后续会有单独的文章详细介绍,见这里
SSRF
服务端请求伪造,通过服务端发起访问请求,如果使用file://协议进行请求,一般会造成任意文件的读取问题。关于SSRF相关漏洞,后续会有单独的文章详细介绍,见这里

文件读取漏洞举例

如下所介绍的几个漏洞也可以其他的标签或者分类,但应为其最为严重的后果是任意文件读取,因此此处也可以将其归为文件读取漏洞。

CVE-2018-1999002

该漏洞是jenkins服务器中的一个文件读取漏洞。存在漏洞的版本没有对于HTTP请求中的Accept-Language做任何的过滤限制。可以通过构造Accept-Language字段内容,读取服务器中的敏感文件,如下图2 NVD中的介绍
在这里插入图片描述
图2

jenkins服务是属于企业关键性的服务,所有有代码开发的企业一般均采用Jenkins作为其代码构建发布服务。虽然该漏洞只是导致了一些文件的读取,但是其影响属于关键资产,因此需要加以重视。下面根据公开的POC以及jenkins修复的patch进一步的分析该漏洞。其中POC如图3所示:
在这里插入图片描述

图3
由于jenkins这种软件是全球性的软件,原本目的是根据客户端Accept-Language的不同,返回不同语言的文件。通常来说HTTP中的Accept-Language字段是用来表示客户端接收的语言,常见的形式为Accept-Language: zh-cn,其中zh表示语言为汉语,cn表示国家中国。但是图中POC可以看到该漏洞将Accept-Language字段的值设置为一个文件路径,则导致该文件被读取。

扫描二维码关注公众号,回复: 15406825 查看本文章

对比漏洞patch内容,如下图4:
在这里插入图片描述

图4
对比补丁和POC来看,在修复的版本中对于Accept-Language字段中的language以及country内容,通过正则表达式的形式进行了限定。Language的值只能是2-8位的字母组合,country的值只能是2位的字母组合或者3位的数字组合。这样之前的POC由于具有特殊字符就没有办法利用成功了。

可以看到最终的文件名称的构成至少要包括base,language,扩展名。因此真正的利用还要设定好base和ext的值,不在赘述,感兴趣的可以自行实验。这个漏洞从利用的角度来也可以是目录穿越漏洞,从最终的结果来看,最严重的的结果就是敏感文件的读取,因此也可以称之为文件读取漏洞。

CVE-2016-9086

该漏洞是gitlab软件中的文件读取漏洞,gitlab具备项目的导出和导入的功能。将导出的文件中的文件修改成系统同名文件(如/etc/passwd)的软链接文件则会导致后续的导入时,由于后台解析错误,直接抛出异常,同时打印文件文件内容,导致了任意文件的读取。这种情况其实是程序员经常犯的错误,即直接打印出错文件的内容,如下图5 NVD中的介绍:
在这里插入图片描述

图5
该漏洞的POC如下图6,7,8:
在这里插入图片描述
图6
在这里插入图片描述
图7
在这里插入图片描述
图8

图中6可以看到从gitlab export导出文件后,将其中的project.json修改为如图7的软链接文件,指向/etc/passwd。上传修之后的打包文件,得到了图8的结果,成功的读取了/etc/passwd中的内容。可以看到该漏洞的后果是导致了文件的读取,表象好像是文件上传所导致的,实际上是后台在处理文件的时候没有考虑软连接的情况。对应的patch,这里, 如下图9所示。
在这里插入图片描述

图9
图9可以看到针对该漏洞的利用POC,在修复的版本中直接先判断是否是软链接,如果是软链接,则删除。除此之外,对于project.json解析出错还有version检查出错的情况,不会直接打印文件到前端,而是形成日志记录,如图10:
在这里插入图片描述
图10
从该漏洞给我们的提示就是程序员要避免在异常出错的情况下,直接打印文件内容,否则可能导致文件读取漏洞。

文件读取之潜在危害

文件读取这类漏洞的主要是以漏洞导致的后果进行分类的,因此可以说任意文件读取的后果就是导致服务器上的配置等敏感信息被获取。因此文件读取的漏洞常备作为信息收集的手段,包括配置文件,密钥信息,程序源码,历史命令等,这些都是服务器中的文件,是可以被读取的。

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

猜你喜欢

转载自blog.csdn.net/javajiawei/article/details/127352633