javaweb-codereview 学习记录-2
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的更多相关文章
- javaWeb后端学习记录
java后端学习重点: 1.java语言特性: 基础知识,集合,多线程,并发,JVM,NIO,网络编程,设计模式. (★★★★★) jdk源码中有大量的数据结构与java语言细节.jdk源码着重看c ...
- java后端学习记录2019
学习计划 2019年计划 1.学习计算机基础,并加以实践.包括LeetCode刷题.数据库原理(索引和锁.Sql优化等).网络协议(Http.Tcp).操作系统(加深Linux).<Http权威 ...
- Spring Boot学习记录(二)--thymeleaf模板 - CSDN博客
==他的博客应该不错,没有细看 Spring Boot学习记录(二)--thymeleaf模板 - CSDN博客 http://blog.csdn.net/u012706811/article/det ...
- Quartz 学习记录1
原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...
- Java 静态内部类与非静态内部类 学习记录.
目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...
- Apache Shiro 学习记录4
今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...
- JavaWeb基础学习体系与学习思路
对于JAVAWEB的学习,首先一定要明确的是学习整体框架和思路,要有一个把控.对于WEB,很多人认为是做网页,简单的把静态网页与JAVAWEB与网页设计一概而论. 拿起一本JS就开始无脑的学习,学了一 ...
- UWP学习记录12-应用到应用的通信
UWP学习记录12-应用到应用的通信 1.应用间通信 “共享”合约是用户可以在应用之间快速交换数据的一种方式. 例如,用户可能希望使用社交网络应用与其好友共享网页,或者将链接保存在笔记应用中以供日后参 ...
- UWP学习记录11-设计和UI
UWP学习记录11-设计和UI 1.输入和设备 通用 Windows 平台 (UWP) 中的用户交互组合了输入和输出源(例如鼠标.键盘.笔.触摸.触摸板.语音.Cortana.控制器.手势.注视等)以 ...
- UWP学习记录10-设计和UI之控件和模式7
UWP学习记录10-设计和UI之控件和模式7 1.导航控件 Hub,中心控件,利用它你可以将应用内容整理到不同但又相关的区域或类别中. 中心的各个区域可按首选顺序遍历,并且可用作更具体体验的起始点. ...
随机推荐
- linux 在 scull 中使用旗标
旗标机制给予 scull 一个工具, 可以在存取 scull_dev 数据结构时用来避免竞争情况. 但是正确使用这个工具是我们的责任. 正确使用加锁原语的关键是严密地指定要保护哪个 资源并且确认每个对 ...
- ZeroNet搭建个人网站,一些搞笑图片
ZeroNet是一个利用比特币加密和BT技术提供不受审查的网络与通信的BT平台,ZeroNet网络功能已经得到完整的种子的支持和加密连接,保证用户通信和文件共享的安全.使用ZeroNet,你可以匿名上 ...
- es6笔记 day2---字符串模板及字符串新增
字符串连接案例 注意:引号变了,为键盘数字1旁边的飘花键 以前的老写法是在字符串中加入“+”号,给几个字符串给串起来,那种写法是要死人的. 现在只需加上一对``即可将字符串连接起来 --------- ...
- 2018-8-10-win10-uwp-按下等待按钮
title author date CreateTime categories win10 uwp 按下等待按钮 lindexi 2018-08-10 19:16:50 +0800 2018-2-13 ...
- ie6,7不支持display:inline-block;
解决方案: display:inline-block; *display:inline;*zoom:1; ie6:* _ ,ie7:*
- js解决跨域下载文件
之前用的是a标签的方式,同源是没有问题的,但一跨域就不行了,试了其它方法,不是报跨域错误,就是在当前页面打开文件,体验相当不好. data = data.replace(/\\/g, '/'); va ...
- Mac 安装Maven,并设置环境变量
1 / 打开电脑,找到终端命令行工具,输入maven环境变量查询工具: mvn -v 2 / 执行上述命令后,此时没有安装的两个提示信息,一个时没有mvn命令,一个时没有安装maven.执行下面命令开 ...
- 赋值、关系、逻辑运算、if、switch case
cout << boolalpha将打印输出0转为false,1转为true 逻辑运算符: &&(与) 且 两个条件为真时结果为真 ||(或) 或 两个 ...
- vue文章学习路线
vue学习笔记(一)入门 Vue实现简单的购物车功能 vue学习笔记(二)vue的生命周期和钩子函数 使用webstorm搭建vue-cli项目 vue-cli项目中引入第三方插件 vue-cli项目 ...
- 【一起学源码-微服务】Nexflix Eureka 源码九:服务续约源码分析
前言 前情回顾 上一讲 我们讲解了服务发现的相关逻辑,所谓服务发现 其实就是注册表抓取,服务实例默认每隔30s去注册中心抓取一下注册表增量数据,然后合并本地注册表数据,最后有个hash对比的操作. 本 ...