【缺陷周话】第8期:路径遍历

阅读量    33059 | 评论 2

分享到: QQ空间 新浪微博 微信 QQ facebook twitter

 

1、路径遍历

路径遍历是指应用程序接收了未经合理校验的用户参数用于进行与文件读取查看相关操作,而该参数包含了特殊的字符(例如“..”和“/”),使用了这类特殊字符可以摆脱受保护的限制,越权访问一些受保护的文件、目录或者覆盖敏感数据。本文以JAVA 语言源代码为例,分析路径遍历缺陷及该缺陷产生的原因及修复方法。详见:CWE ID 22: Improper Limitation ofa Pathname to a Restricted Directory (‘Path Traversal’) (http://cwe.mitre.org/data/definitions/22.html)、CWEID 23: Relative Path Traversal (http://cwe.mitre.org/data/definitions/23.html)、CWEID 36: Absolute Path Traversal (http://cwe.mitre.org/data/definitions/36.html) 和 CWE ID 73: External Control of File Name or Path (http://cwe.mitre.org/data/definitions/73.html)。

 

2、 路径遍历的危害

路径遍历利用应用程序的特殊符号(“~/”,“../”)可以进行目录回溯,从而使攻击者越权访问或者覆盖敏感数据,如网站的配置文件、系统的核心文件等。从2018年1月至11月,CVE中共有388条漏洞信息与其相关。部分漏洞如下:

CVE 漏洞概述
CVE-2018-1656 IBM Java Runtime Environment 的 Java 诊断工具框架(DTFJ) (IBM SDK,Java Technology Edition 6.0,7.0和8.0)在提取压缩转储文件时不能防止路径遍历攻击。
CVE-2018-1999020 Open Networking Foundation(ONF)ONOS 版本 1.13.2 及更早版本包含 core / common / src / main / java / org / onosproject / common / app / ApplicationArchive.java 第35行中的 Directory Traversal 漏洞,可能导致任意文件删除(覆盖)。这种攻击似乎可以通过特制的 zip 文件进行上传。
CVE-2018-14371 在2.3.7之前的 Eclipse Mojarra 中的 ResourceManager.java 中的 getLocalePrefix 函数受 Directory Traversal 通过 loc 参数的影响。远程攻击者可以从应用程序下载配置文件或 Java 字节码。
CVE-2018-1000194 Jenkins 2.120 及更早版本,LTS 2.107.2 及更早版本的 FilePath.java 中存在路径遍历漏洞,SoloFilePathFilter.java 允许恶意代理在 Jenkins 主服务器上读写任意文件,绕过代理到主安全子系统保护。

 

3、示例代码

示例源于 Samate Juliet Test Suite for Java v1.3 https://samate.nist.gov/SARD/testsuite.php),源文件名:CWE23_Relative_Path_Traversal__Environment_41.java。

3.1缺陷代码

上述示例代码在第112行获取了环境变量的值 data,第44行创建了一个 File 对象,构造函数的参数是传入的环境变量的值 data,接收参数后未对参数做合理校验,当环境变量的值为 “../file.bat”,假定文件路径有效,则可能导致读取了 uploads 父目录下的 file.bat 文件。

使用360代码卫士对上述示例代码进行检测,可以检出“路径遍历”缺陷,显示等级为高。如图1所示:

图1路径遍历检测示例

3.2 修复代码

在上述修复代码中,在调用 badSink() 函数之前,我们对传入的参数进行处理。在第112行中,获取到环境变量并赋值给 data,这时使用正则表达式过滤掉特殊字符 ”/” : | * ? < >”,当再调用 badSinks() 函数时,即使 data 的值为 “../file.bat”,在经过过滤后则为 ”..file.bat”,始终保持了可以被访问的文件在 “C:uploads” 下,这样就避免了路径遍历的发生。

使用360代码卫士对修复后的代码进行检测,可以看到已不存在“路径遍历”缺陷。如图2:

图2:修复后检测结果

 

4 、如何避免路径遍历

要避免路径遍历,需要注意以下几点:

(1)程序对非受信的用户输入数据净化,对网站用户提交过来的文件名进行硬编码或者统一编码,过滤非法字符。

(2)对文件后缀进行白名单控制,对包含了恶意的符号或者空字节进行拒绝。

(3)合理配置 web 服务器的目录权限。