1.Java 文件名空字节截断漏洞(%00 Null Bytes)

受空字节截断影响的JDK版本范围:JDK<1.7.40

实际上修复就是检查文件名中是否包含\u0000,包含则为非法路径

find usages看一下可以看到跟文件名相关的函数基本上都调用了此函数来进行校验,比如这里用java1.6进行测试,用\u0000就进行了成功的截断

用大于1.7.40的肯定会报错,这里修复的话如果考虑到jdk兼容问题,最好的方法就是添加fileName.indexOf('\u0000')的判断

如下面的代码所示,如果filename是从url中获取的并且用户可控就可能造成任意文件读取

import java.io.File;
import java.io.FileInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException; public class file_read {
public static void main(String[] args){ try {
String filename = "c:\\install.ini";
File file = new File(filename);
FileInputStream fin = new FileInputStream(file); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] b = new byte[1024];
int a= -1; while ((a=fin.read(b))!=-1){
//System.out.println(a);
baos.write(b,0,a); }
System.out.println(new String(baos.toByteArray()));
fin.close(); } catch (IOException e) {
e.printStackTrace();
}
} }

2.类加载机制

Java程序在运行前需要先编译成class文件,Java类初始化的时候会调用java.lang.ClassLoader加载类字节码,ClassLoader会调用JVM的native方法(defineClass0/1/2)来定义一个java.lang.Class实例。

所有的类都必须要让JVM加载以后才能够运行,classloader主要完成的就是类文件的加载

jvm的类加载器包括:

引导加载器Bootstrap ClassLoader

扩展类加载器 Extension ClassLoader

系统类加载器 App ClassLoader,默认情况下使用的类加载器就是App Classloader,使用ClassLoader.getSystemClassLoader()返回的也是App ClassLoader加载器。

ClassLoader 类有如下核心方法:

1.loadClass (加载指定的Java类)

2.findClass(查找指定的Java类)

感觉上面两个最常用

3.findLoadedClass(查找JVM已经加载过的类)

4.defineClass(定义一个Java类)

5.resolveClass(链接指定的Java类)

Java类动态加载方式:

分为显式和隐式加载,显式加载即通过java反射机制或者ClassLoader机制来动态加载一个类对象,隐式一般就是通过类名.方法名或者new 类实例来加载。感觉很多开源库用反射加载类用的挺多,在调试fastjson中调用链实际上还用到了ClassLoader来动态加载类。

例子:

反射:

Class.forname("java.lang.Runtime");

类加载器:

this.getClass().getClassLoader().loadClass('java.lang.Runtime');

其中用Class.forName("java.lang.Runtime")默认会初始化被加载类的静态属性和方法

可以使用Class.forName('java.lang.Runtime',是否初始化,类加载器)来不让类进行初始化,防止去加载可能恶意类中静态方法的代码

javaweb-codereview 学习记录-2的更多相关文章

  1. javaWeb后端学习记录

    java后端学习重点: 1.java语言特性: 基础知识,集合,多线程,并发,JVM,NIO,网络编程,设计模式.  (★★★★★) jdk源码中有大量的数据结构与java语言细节.jdk源码着重看c ...

  2. java后端学习记录2019

    学习计划 2019年计划 1.学习计算机基础,并加以实践.包括LeetCode刷题.数据库原理(索引和锁.Sql优化等).网络协议(Http.Tcp).操作系统(加深Linux).<Http权威 ...

  3. Spring Boot学习记录(二)--thymeleaf模板 - CSDN博客

    ==他的博客应该不错,没有细看 Spring Boot学习记录(二)--thymeleaf模板 - CSDN博客 http://blog.csdn.net/u012706811/article/det ...

  4. Quartz 学习记录1

    原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...

  5. Java 静态内部类与非静态内部类 学习记录.

    目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...

  6. Apache Shiro 学习记录4

    今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...

  7. JavaWeb基础学习体系与学习思路

    对于JAVAWEB的学习,首先一定要明确的是学习整体框架和思路,要有一个把控.对于WEB,很多人认为是做网页,简单的把静态网页与JAVAWEB与网页设计一概而论. 拿起一本JS就开始无脑的学习,学了一 ...

  8. UWP学习记录12-应用到应用的通信

    UWP学习记录12-应用到应用的通信 1.应用间通信 “共享”合约是用户可以在应用之间快速交换数据的一种方式. 例如,用户可能希望使用社交网络应用与其好友共享网页,或者将链接保存在笔记应用中以供日后参 ...

  9. UWP学习记录11-设计和UI

    UWP学习记录11-设计和UI 1.输入和设备 通用 Windows 平台 (UWP) 中的用户交互组合了输入和输出源(例如鼠标.键盘.笔.触摸.触摸板.语音.Cortana.控制器.手势.注视等)以 ...

  10. UWP学习记录10-设计和UI之控件和模式7

    UWP学习记录10-设计和UI之控件和模式7 1.导航控件 Hub,中心控件,利用它你可以将应用内容整理到不同但又相关的区域或类别中. 中心的各个区域可按首选顺序遍历,并且可用作更具体体验的起始点. ...

随机推荐

  1. C# 在基类定义好方法让子类继承接口就能实现

    在 C# 里面,接口的定义只需要类里面存在和接口声明相同的方法或属性就可以,而存在的方法或属性是在子类定义的还是基类里面定义的都无所谓.也就是在基类里面写好了方法,但不继承接口,等子类继承接口的时候就 ...

  2. 【75.28%】【codeforces 764B】Decoding

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  3. ASP.NET MVC 实现页落网资源分享网站+充值管理+后台管理(8)之文章管理

    到这一步,我们整个项目的核心搭建已经算是完成了,接下来就是我们业务功能的实际应用,也就是表现层的设计和实现,如果你是一个项目负责人,到这一步,接下来的工作就可以交给下面的兄弟去完成了,在这里我们用文章 ...

  4. ZR并查集专题

    ZR并查集专题 并查集,作为一个基础算法,对于初学者来说,下面的代码是维护连通性的利器 return fa[x] == x ? x : fa[x] = getf(fa[x]); 所以,但是这对并查集的 ...

  5. H3C使用ping命令

  6. js 快速取整

    我们要将23.8转化成整数  有哪些方法呢 比如 Math.floor( ) 对数进行向下取整  它返回的是小于或等于函数参数,并且与之最接近的整数 Math.floor(5.1) 返回值 //5 M ...

  7. koa2入门--09.art-template高速模板引擎的使用

    首先在项目文件夹下使用 cmd,输入:npm install --save art-template koa-template art-template语法参考:http://aui.github.i ...

  8. python知识点总结02(不定时更新)

    请用至少两种方式实现m与n值交换m=10,n=5 # 方式一 temp = 0 m = 10 n = 5 print(f'方式一交换前,m:{},n:{}') temp = m m = n n = t ...

  9. 选题Scrum立会报告+燃尽图 02

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/8680 组长:杨天宇 组员:魏新,罗杨美慧,王歆瑶,徐丽君 组名:组长 第 ...

  10. TemplateMethodPattern(模板方法模式)-----Java/.Net

    一个抽象类公开定义了执行它的方法的方式/模板.它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行.这种类型的设计模式属于行为型模式