Java安全基础——文件系统安全

前言:空字节截断漏洞漏洞在诸多编程语言中都存在,究其根本是Java在调用文件系统(C实现)读写文件时导致的漏洞,并不是Java本身的安全问题,不过好在高版本的JDK在处理文件时已经把空字节文件名进行了安全检测处理

1:我们先来熟悉常用的几个操作文件的类

字节流:

FileInputStream:从文件或其他外部源读取数据到jvm内存,一次只读一个字节

FileOutputStream:将jvm内存的数据写入文件或其他外部目标,一次只输出一个字节

BufferedInputStream:字节缓存流,一次读取一个或者指定的字节

BufferedOutputStream:字节缓存流,一次写入一个或者指定的字节

ObjectInputStream:序列化,将对象写入到文件

ObjectOutputStream:反序列化,将文件读取到jvm内存

字符流:

FileReader:从文件或其他外部源读取数据到jvm内存,一次只读一个字节,遇到中文读多个字节

FileWriter:写入在缓冲区中(长度为8192的字节的数组)

BufferedReader:字符缓冲流,特有的方法(readLine)读取一行

BufferedWriter:字符缓冲流,特有的方法(newLine)阔平台换行

InputStreamReader:把字节输入流转换成字符输入流

OutputStreamWriter:把字符输出流转换成字节输出流

2:缓存流的原理

缓存区先向文件中一次读取8192个字节,文件如果没有8192个字节,则有多少装多少,然后利用变量b去往缓冲区进行读取并写到缓冲输出流的缓冲区中,如果缓冲输出流的缓冲区装满了则会自动写入到目的地中,如果关流会检查缓冲区里面有没有数据,然后再把缓冲区的数据写到文件当中,数组是一样的原理

3:完整流程图

4:绕过WAF和RASP的检测

在Java SE中内置了两类文件系统:java.io和java.nio,java.nio的实现是sun.nio,文件系统底层的API实现如下图:

如果WAF和RASP只检测了io包下的类,我们可以使用nio包下的类来进行绕过实现

5:JDK1.7.0.25之前的漏洞(空字节截断)

原理:

攻击者上传一个精心构造的文件名,例如:malicious.php\0.jpg。

关键点:这个文件名在Java层看起来是 "malicious.php\0.jpg"。

Java代码进行检查:"malicious.php\0.jpg".endsWith(".jpg") -> true,因为从Java的角度看,这个字符串确实以 .jpg 结尾。安全检查被绕过!

现在,Java代码试图将这个文件保存到磁盘,比如路径是 /uploads/malicious.php\0.jpg。

当Java通过JNI调用系统的 fopen 或 createFile 等C函数时,Java字符串 "/uploads/malicious.php\0.jpg" 被转换为C字符串

在C函数眼中,一旦读到 \0,它就认为路径是 /uploads/malicious.php,而后面的 .jpg 被完全忽略

最终,服务器上保存的不是 malicious.php\0.jpg,而是一个名为 malicious.php 的可执行脚本文件

相关推荐
考虑考虑7 小时前
JDK26中的Map.ofLazy
java·后端·java ee
鶴哥只手遮天10 小时前
Spring AI 2.0.1 深度解析-第 14 章 MCP 服务端(上):注解式实现与工具来源
java·人工智能·开源
鶴哥只手遮天10 小时前
Spring AI 2.0.1 深度解析-第 15 章 MCP 服务端(下):三种协议形态、Streamable 传输与状态管理
java·人工智能·开源
鶴哥只手遮天11 小时前
Spring AI 2.0.1 深度解析-第 16 章 向量存储(上):`VectorStore` 接口体系、`BatchingStrategy`
java·人工智能·开源
鶴哥只手遮天11 小时前
Spring AI 2.0.1 深度解析-第 12 章 工具循环的流式形态、Usage 累加与扩展体系
java·人工智能·开源
鶴哥只手遮天11 小时前
Spring AI 2.0.1 深度解析-第 23 章 模型供应商实现:从 `OpenAiSetup` 到 Bedrock
java·人工智能·开源
鶴哥只手遮天11 小时前
Spring AI 2.0.1 深度解析-第 06 章 内置 Advisor 全景:13 个实现逐个剖到源码级
java·人工智能·开源
鶴哥只手遮天11 小时前
Spring AI 2.0.1 深度解析-第 03 章 消息体系与 Prompt:不可变模型、`ChatOptions` 与模板渲染
java·人工智能·开源
鶴哥只手遮天11 小时前
Spring AI 2.0.1 深度解析-第 24 章 生产实践与 2.x 迁移:陷阱清单、AOT 与调优
java·人工智能·开源
鶴哥只手遮天11 小时前
Spring AI 2.0.1 深度解析-第 10 章 工具调用(中):执行链路、结果转换与工具限制
java·人工智能·开源