文件操作安全之-目录穿越原理篇

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

Linux系统中提供了./用以表示当前目录,…/表示上一级目录,如下是Linux系统中关于这些字符的用法:
在这里插入图片描述

图1

在linux中一切皆文件,可以看到每个文件夹下面都是存在着./以及…/两个文件的,用来表示当前文件目录和上一级的文件目录,因此可以使用cd命令对这两个字符进行操作。

目录穿越之漏洞原理

关于目录穿越的定义,CWE的定义如下图2:
在这里插入图片描述

图2
在web服务中,URL是访问文件的路径标识,该路径和后台web服务器上的文件路径有着某种对应的关系,如图3:
在这里插入图片描述

图3
其中packetstormsecurity.com是该web服务的广域网地址(相当于IP地址),在定位到该IP服务器之后,则会根据URL到相应的目录下去查找对应的文件。/files/164418/是对外显示的文件目录,实际的服务器后台绝对路径可能是web目录+/files/164418/,例如/var/www/html/files/164418/。如果不对输入的URL进行限制,则存在着构造特殊的URL路径,映射到具体的服务器目录则导致访问回溯,最常见的后果是导致任意文件访问。

目录穿越之漏洞举例

目录穿越的漏洞曾经是非常的普遍,但是随着框架的普及以及安全意识的提升,没有任何过滤所导致的目录穿越漏洞越来越少。但是绝大多数的程序员是缺乏攻击者视角的,目前文件目录穿越的防护还是依赖于一些框架所提供的的一些机制,因此框架本身处理不当将会导致比较严重的后果。目前来看,框架中导致目录穿越漏洞原因更多的集中在一些细微之处的疏忽。下面介绍一个比较典型的目录穿越漏洞。

CVE-2021-41773

该漏洞是Apache HTTP SERVER的一个漏洞,存在于在2.4.49 版本中。当解析HTTP请求中的文件路径时候,文件路径标准化处理函数ap_normalize_path考虑不周,导致可以通过编码构造文件路径实现任意文件的访问,由于apache的HTTP服务器通常情况下会开启CGI的配置,因此该漏洞还有可能导致任意命令执行。如下图4 NVD中的介绍

在这里插入图片描述
图4
由于该漏洞是apache http服务器漏洞,属于基础性服务软件,因此可以说影响所有使用apache服务器的网站,因此从该漏洞从影响面,apache http server的流程程度,以及可能潜在的后果来看,这是一个非常严重的漏洞。下面根据公开的exp以及apache 修复的patch进一步的分析该漏洞。其中exp(该漏洞的利用程序)如图5所示:
在这里插入图片描述
图5
图中提供了两个利用示例,可以看到只要对第二个点使用%2e进行URL编码,即可绕过URL标准化处理程序实现目录穿越。两个示例会导致两种后果,其一是实现任意文件读取(读取/etc/passwd),其二是在开启CGI(CGI允许Web服务器执行外部程序,并将它们的输出发送给Web浏览器)的情况下,实现任意命令的执行(即在/bin/sh中执行whoami命令)。对比漏洞patch内容,如下图6:
在这里插入图片描述
图6
对比补丁来看,其注释表明,修复之前的版本仅仅是在标准化的时候略过了…/这样的字符,而修复后的版本增加了对于.%2e/这种情况的处理。这种修复的方式是一种非常典型的处理方式,即在漏洞爆出之后,为了尽可能的修复该漏洞,针对POC即图4中的利用进行修复,限制%2e的使用。由于业务开发人员对于往往不具备攻防知识,因此修复的结果往往是治标不治本。因此在2.4.50版本修复完成之后,很快针对修复版本出现了新的利用,虽然针对的是同一个问题,但是软件的版本不同,因此被赋予了漏洞编号CVE-2021-42013。

CVE-2021-42013

上图5中也有提到CVE-2021-41773中的补丁修复不够的完备,仍然存在绕过的情形,如下图7 NVD中的介绍:
在这里插入图片描述
图7
该漏洞的利用程序,如下图8:
在这里插入图片描述
图8
对比图8中的漏洞利用程序和 CVE-2021-41773 即图5中的利用程序,是很容易理解该漏洞的成因的,即没有对双编码的情形加以考虑,如下图9为该漏洞CVE-2021-42013的patch修复情况:

在这里插入图片描述
图9
从图9中的补丁对比可以看出,在遇到双编码的时候,直接返回0(非法编码),表示URL标准化失败,这样的话,该URL就不会被成功的处理,从而避免双编码的利用。

CVE-2021-41773和CVE-2021-42013被分配了两个不同的编号,但是实际上这两个漏洞可以说是相关性非常强的漏洞,问题出现在同一个函数之中,只是影响的版本不同。历史上曾经多次出现过面向POC的修复导致修复不完备的情况,针对同一个问题被连续分配多个漏洞编号。这其中的根因是因为绝大多数的软件开发人员缺乏安全知识,无法从攻防的角度系统性的考虑业务功能安全。因此目前整个软件安全还是通过黑盒测试,白盒审计以及POC的开放促进软件的业务安全。由于黑盒白盒,白盒审计都无法100%覆盖所有的漏洞,因此尽可能早的漏洞细节纰漏对于软件的修复以及安全防御都是很重要的。

上述从漏洞POC以及源码层面介绍了目录穿越的漏洞,要想深入的体验该漏洞的影响,建议使用apache 2.4.50的release环境自行的验证,加深对于该漏洞的理解,如下图10 vulhub中的环境:
在这里插入图片描述
图10

目录穿越之潜在危害

前面从原理和示例两份方面针对目录穿越进行了简单阐述,目录穿越会导致哪些后果呢。应该来说不同的漏洞影响程度是不一样的。下面列举目录穿越漏洞潜在的危害:

  • 任意文件访问,这应该是目录穿越漏洞导致的最常见后果了,例如图8中的POC利用目录穿越读取/etc/passwd等关键文件。
  • 信息泄露,这类的后果比之任意文件访问影响小一些。在复杂的软件中,各种黑白名单的限制,导致目录穿越能够访问文件受限,例如访问权限仅存在于WEB空间目录,这个时候会导致一些敏感配置文件的泄露
  • 远程命令执行,一般我们提到远程命令执行说的是这一类漏洞的统称,但是在本文的漏洞中,例如图8中的POC示例,可以看到在CGI开启的情况下,也会因为目录穿越导致远程命令执行的发生。

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

猜你喜欢

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