Java代码审计之目录穿越

安全避风港 / 2023-08-29 / 原文

一、目录穿越漏洞

1、什么是目录穿越

  所谓的目录穿越指利用操作系统中的文件系统对目录的表示。在文件系统路径中,".."表示上一级目录,当你使用"../"时,你正在引用当前目录的上一级目录。如果你使用"../../",你实际上在两次".."的基础上,再次引用上一级目录,从而返回到上两级目录。

  例子:假设你目前所在目录为:C:\Windows\System32\drivers\etc

  • 使用"../" 一次返回上一级目录,即:C:\Windows\System32\drivers
  • 使用"../../" 一次返回上一级目录,即:C:\Windows\System32

  这是因为在文件系统路径中,每个".."都表示回到上一级目录。所以多个连续的".."会连续返回到更高级别的目录。然而在漏洞利用中Windows和Linux系统会有区别,后续漏洞利用中会提到。

2、目录穿越漏洞成因

  目录穿越漏洞,也叫做目录遍历/路径遍历漏洞。常发生于文件上传,文件下载,文件下载等处。由于后端直接接收前端传过来的文件名或路径,没有对其进行检测与过滤,导致攻击者利用../的方式进行目录穿越,达到任意文件读取/下载,任意文件删除,或将任意文件上传到指定目录等。

3、目录穿越漏洞的利用

  Windows中目录穿越漏洞由于操作系统可能导致只能在设定好的盘符下进行穿越,不能越过其他盘符读取,如:读取日志文件,后端代码F:/wwwroot/logs + "前端传递的文件名"。此时通过../进行目录穿越只能在F盘下进行读取,不能读取F盘以外的任何文件,如:C:\windows\win.ini。而Linux中却不受到这种限制,只要有足够的权限可以读任意目录下的文件。

  一般目录穿越导致的主要为任意文件读取,一般都是读取配置文件,因为配置文件中保存着大量敏感信息,如:各种数据库连接地址与账号密码

4、案例代码演示

  环境:

    jdk 1.8(1.8.0_211)
    Maven 3.9.1
    IDEA 2022.3.3

  创建spring项目

   

  使用IDEA新建一个项目,如下图所示,按需配置。这里记得选择2.x的版本

  

  演示代码如下:

参考自:https://github.com/j3ers3/Hello-Java-Sec/blob/master/src/main/java/com/best/hello/controller/Traversal.java

代码就是正常的文件读取操作,如果不理解学习一下java I/O

 

任意文件读取:

 

 

任意路径遍历:

 

 

5、漏洞修复

通过前面原理介绍,目录穿越是由于文件系统的特性所导致的,通过../进行目录的跨越。修复只需要检测字符".."与"/"即可,在对应语言中加入检测即可,以java为例:写一个工具类检测即可

public class Security {

//    目录穿越检验
    public static boolean checkTraversal(String content){
        return content.contains("..") || content.contains("/");
    }
}