首页 > 编程语言 >Java代码审计之目录穿越

Java代码审计之目录穿越

时间:2023-08-29 11:12:19浏览次数:74  
标签:审计 文件 Java 读取 .. 漏洞 穿越 目录

一、目录穿越漏洞

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("/");
    }
}

标签:审计,文件,Java,读取,..,漏洞,穿越,目录
From: https://www.cnblogs.com/chm0d/p/17664249.html

相关文章

  • Java并发编程的挑战与解决方案
    Java并发编程是一个复杂而重要的主题,开发者在处理并发场景时经常面临各种挑战。本文将讨论Java并发编程中的一些重要概念和问题,并提供实际的代码示例和解决方案。一、Java并发编程的基本概念线程与进程的区别并发和并行的概念共享资源与竞态条件线程安全性与数据同步二、Java......
  • 深入探究Java中的多线程并发与同步
    在后端开发中,多线程编程是一项关键技术,能够充分利用多核处理器,提高系统性能和响应能力。然而,多线程编程涉及到并发与同步问题,可能引发复杂的线程安全难题。本篇博客将深入探讨Java中的多线程编程,重点关注并发问题和同步机制。并发与多线程并发是指多个任务在同一时间段内执行,而多线......
  • 闰年、数字统计和成绩分析 - Java编程案例
    目录1.判断闰年2.统计数字出现次数3.成绩分析导言:最近,我在学习Java编程过程中遇到了一些有趣的问题,其中包括判断闰年、统计数字出现次数以及分析成绩等。通过编写代码并解决这些问题,我不仅加深了对Java的理解,还提高了编程能力。在本篇博客中,我将与大家分享我遇到的这些问题以及......
  • 练习题 - Java编程案例
    当用户在Java程序中输入字符时,我们可以通过代码对这些字符进行判断和处理。在这篇博客中,我们将介绍如何使用Java编写一个程序,根据用户输入的字符进行判断,并进行相应的输出。首先,让我们来看看如何判断一个字符是否为元音字母(a、e、i、o、u)。我们可以使用Scanner类来获取用户输入的字......
  • 购物系统分析与实现 - Java编程案例
    目录1.购物系统分析2.实现购物系统2.1程序入口2.2菜单显示2.3用户输入2.4计算购买数量和剩余金额2.5结果输出3.执行购物系统总结简介:本文将介绍一个简单的购物系统的实现,使用Java编程语言来实现一个基于控制台的购物系统。通过这个实例,我们可以学习如何进行用户输入、条件......
  • 打印图形:三角形、圆形和正方形 - Java编程案例
    目录1.打印三角形2.打印圆形3.打印正方形总结简介:本文将介绍如何使用Java编程语言打印出不同的图形,包括三角形、圆形和正方形。我们将使用嵌套循环和基本的数学计算来实现这些图形的打印。1.打印三角形首先,让我们来打印一个简单的三角形。在代码中,我们使用了一个嵌套的循环来控......
  • 张三坐电梯的计算问题 - Java编程实现
    摘要:本文介绍了一个关于张三坐电梯的计算问题,并通过Java代码实现了解决方案。在张三学校的教学楼前排了很多人,他的前面有n个人在等电梯。电梯每次可以乘坐12人,每次上下需要的时间为4分钟(上需要2分钟,下需要2分钟)。现在,我们需要帮助张三计算还需要多少分钟才能乘电梯到达楼上。我们......
  • java实现的类似于sql join操作的工具类,通用递归,最低需要java8
    直接上代码,缺包的自行替换为自己项目中存在的importjava.util.ArrayList;importjava.util.Collection;importjava.util.HashMap;importjava.util.HashSet;importjava.util.List;importjava.util.Map;importjava.util.Set;importjava.util.function.BiConsumer;i......
  • JAVA编译准备
    1.JAVA语言特点1.Java语言是面向对象的(oop)2.Java语言是健壮的。Java的强类型机制、异常处理、垃圾的自动收集等是Java程序健壮性的重要保证3.Java语言是跨平台性的。[一个编译好的.class文件可以在多个系统下运行]4.Java语言是解释型语言解释型语言:java、javascript、P......
  • Java底层起步
    <h3style="text-align:center;">Java底层起步</h3>Java介绍什么是面向对象?例如:小戴正在做饭时,发现没酱油了,对着外面的朋友小张说,小张你去买瓶酱油,然后小张给楼下超市的小王打电话,让送了一瓶酱油上来。在上述的过程中,从面向对象的角度来讲,其强调的是谁来做这个事,而不是这个事......