官方公众号企业安全新浪微博
FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。
FreeBuf+小程序
前言
代码审计是使用静态分析发现源代码中安全缺陷的方法,能够辅助开发或测试人员在软件上线前较为全面地了解其安全问题,防患于未然,因此一直以来都是学术界和产业界研究的热点,并且已经成为安全开发生命周期SDL和DevSecOps等保障体系的重要技术手段。
360代码卫士团队基于自主研发的国内首款源代码安全检测商用工具,以及十余年漏洞技术研究的积累,推出“缺陷周话”系列栏目。每周针对CWE、OWASP等标准中的一类缺陷,结合实例和工具使用进行详细介绍,旨在为广大开发和安全人员提供代码审计的基础性标准化教程。
阅读前7期【缺陷周话】:
《缺陷周话》第1期:空指针解引用:https://www.freebuf.com/articles/rookie/183889.html
《缺陷周话》第2期:SQL注入:https://www.freebuf.com/news/184732.html
《缺陷周话》第3期:内存泄漏:https://www.freebuf.com/articles/rookie/185356.html
《缺陷周话》第4期:XML外部实体注入:https://www.freebuf.com/vuls/186054.html
《缺陷周话》第5期:越界访问:https://www.freebuf.com/articles/rookie/186749.html
《缺陷周话》第6期:命令注入:http://www.freebuf.com/rookie/187316.html
《缺陷周话》第7期:缓冲区上溢:https://www.freebuf.com/articles/rookie/187891.html
一、路径遍历
路径遍历是指应用程序接收了未经合理校验的用户参数用于进行与文件读取查看相关操作,而该参数包含了特殊的字符(例如“..”和“/”),使用了这类特殊字符可以摆脱受保护的限制,越权访问一些受保护的文件、目录或者覆盖敏感数据。本文以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)。
二、 路径遍历的危害
路径遍历利用应用程序的特殊符号(“~/”,“../”)可以进行目录回溯,从而使攻击者越权访问或者覆盖敏感数据,如网站的配置文件、系统的核心文件等。从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 主服务器上读写任意文件,绕过代理到主安全子系统保护。 |
三、示例代码
示例源于 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:修复后检测结果
四、如何避免路径遍历
要避免路径遍历,需要注意以下几点:
(1)程序对非受信的用户输入数据净化,对网站用户提交过来的文件名进行硬编码或者统一编码,过滤非法字符。
(2)对文件后缀进行白名单控制,对包含了恶意的符号或者空字节进行拒绝。
(3)合理配置 web 服务器的目录权限。
*本文作者:360代码卫士,转载请注明来自FreeBuf.COM