首页 > 编程语言 >JAVA安全学习 Day 1

JAVA安全学习 Day 1

时间:2024-04-25 18:34:16浏览次数:24  
标签:java Class 学习 field JAVA 方法 Day 加载

JAVA ClassLoader机制

谈起JAVA就不得不谈起他的基本类的加载机制
谈一下我的粗略理解:
我一开始也不理解为什么学习java安全要从一个classloader讲起,似乎有点太基层了,但是学到后面的cc链,才有了更明显的理解,因为只有深入理解了java的classloader机制才会在后面构造cc链的时候不会卡手。
其实更基本的来说,因为以后构造cc链的时候,有很多时候会用到类的动态加载,而java的classloader机制是类加载的基础,所以这边我就合在一起来说。
依照大一的一点JAVA基础能勉强让我看懂JAVA代码,但是说句实话,有点不太想看,但是我还是建议初学者先去学习JAVA的基本功,然后深入去研究一下这部分的代码,这样才能有长足的进步。
我这边打算执果索因去讨论一下java的这部分机制(因为我自己在学习的时候很讨厌这种不知道为啥要从这里开始学起的感觉)

[========]

JAVA安全

我对JAVA语言实在算不上有什么好感,但是现在主流的公司包括网页底层代码都在使用JAVA,而安全是个伴生行业,这也就注定了你必须去接触市场上常见的业务,才能做好安全,我所认为的安全是绝对不可能说脱离业务自主存在的。
JAVA的诸多组件和中间件都存在一些常见的反序列化漏洞,也许你知道PHP的反序列化漏洞,那是利用PHP的一些魔术方法执行来做到恶意的利用,而JAVA也是一样的,尤其是重写的readobject方法反序列化代码时会出现执行恶意类中方法的情况。
因此到这里,我们发现我们可以构造恶意的类序列化,传到服务器,让其进行解析,从而达到我们所需要的结果,那么问题来了,我们怎么利用呢?
这就跟后面我们要提到的组件漏洞,jndi注入这类型的漏洞有关系了,但是现在我们需要知道一件事,就是我们要利用漏洞一定要构造一个恶意的类,这里的构造就需要我们掌握类加载的机制了,就是因此我们要先来搞清楚类加载机制。
[========]

类加载机制

java的类加载分为两种方式:

  1. 显式 常见的有利用JAVA反射或ClassLoader来加载(类动态加载)
Class.forName("java.lang.Runtime")

this.getClass().getClassLoader().loadClass("java.lang.Runtime")
  1. 隐式 常见的是 类名.方法名 或 new
Runtime.getRuntime()
new Runtime()

Classloader加载流程

  1. 首先调用loadClass方法加载
  2. 使用findClass方法坚持加载的类有无初始化,有的话直接返回了
  3. 没有的情况,会检查是否有父类的Classloader,如果有就父类加载,如果没有就使用Bootstrap加载
  4. 如果第三步依旧无法加载出来,讲调用自身的findclass方法加载
  5. 如果当前的加载器重写了findclass方法并且加载到了,就使用defineclass去注册该类;如果没有重写,返回类加载失败
  6. 如果调用loadclass传入的resolve为true,还需要调用resolove方法链接类
  7. 返回一个java.lang.Class对象

[========]

JAVA反射机制

简单来说就是通过Class,Constructor,Method,Field这几个类来对我们需要的类做一个完全的反射。
此时我们假设存在一个User类,他有常见的属性name,age,不常见的属性像Dog,常见的方法getName,getAge,那么我们怎么通过反射去获取他的属性并调用他的方法呢?
获得实例:
Class out = Class.forName('com.test.User');
获得方法:
Method method = out.getMethod('setname',String.class);
调用方法:
methond.invoke((new User()),"heise");
反射调用成员变量:

获取当前类的所有成员变量:

Field field = out.getDeclaredFields(--); "--为指定变量即可获得特定变量0"
获得成员变量值:
Object obj = field.get(类实例对象)
修改成员变量值:
field.set(类实例对象,修改后的值)
那么加入我们取出来的变量为private不能修改呢?
field.setAccessible(true)即可
如果我们要修改的值为final呢?
// 修改成员变量的Field对象的modifiers值
modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL);

标签:java,Class,学习,field,JAVA,方法,Day,加载
From: https://www.cnblogs.com/abys5/p/18153778

相关文章

  • Java ---- 阻塞队列 Blocking Queue
    阻塞队列(BlockingQueue)是一种特殊类型的队列,用于多线程环境中,实现进程通信;常见的Java阻塞队列包括:(1)ArrayBlockingQueue(有界队列)内部是采用数组存储元素的,初始化需要指定容器大小,ArrayBlockingQueue可以用于实现数据缓存、限流、生产者-消费者模式等各种应用。在队列的......
  • (数据科学学习手札160)使用miniforge代替miniconda
    本文已收录至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes1简介大家好我是费老师,conda作为Python数据科学领域的常用软件,是对Python环境及相关依赖进行管理的经典工具,通常集成在anaconda或miniconda等产品中供用户日常使用。但长久以来,conda......
  • javascript高级编程系列 - 使用XMLHttpRequest发送请求
    XMLHttpRequest通过XMLHttpRequest发送get请求//创建XMLHttpRequest实例对象constxhr=newXMLHttpRequest();//监听通信状态xhr.onreadystatechange=function(){//请求结束,处理服务器返回的数据if(xhr.readyState===4){//http状态码为200表示成功......
  • JavaScript基本语法
    JavaScript基本语法变量变量是用于存放数据的容器,我们通过变量名获取数据,甚至数据可以修改。变量本质是程序在内存中申请的一块用来存放数据的空间。变量的使用变量在使用时分为两步:1.声明变量2.赋值变量的声明varname;声明一个变量,没有初始化var是一个JS关键字,用......
  • JavaScript简介
    JavaScript简介JavaScript是什么JavaScipt是运行在客户端(浏览器)上的一种编程语言(脚本语言)注:脚本语言:不需要编译,运行过程中由js解释器逐行解释并且执行现在也可以基于node.js技术进行服务器编程浏览器分成两部分∶渲染引擎和JS引擎渲染引擎︰用来解析HTML与CSS,俗称内核,比......
  • JavaScript对象
    JavaScript对象一、数组数组(Array)是指一组数据的集合,其中的每个数据被称作元素,数组是属于内置对象,数组和普通对象的功能类似,都可以用来存储一些值。不同的是:普通对象是使用字符串作为属性名,而数组是使用数字作为索引来操作元素。索引:从0开始的整数就是索引。在数组中......
  • JavaScript元素
    JavaScript元素一.常量常量也称之为“字面量”,是固定值,不可改变。看见什么,它就是什么。常量有下面这几种:数字常量(数值常量)字符串常量布尔常量自定义常量1.1数字常量数字常量非常简单,直接写数字就行,不需要任何其他的符号。既可以是整数,也可以是浮点数。consol......
  • JavaScript基本数据类型
    JavaScript基本数据类型上述一章我们讲到JS数据类型分为基本数据类型与引用数据类型,这张我们主要讲基本数据类型基本数据类型-String字符串字符串是我们开发中经常使用的一种数据类型,主要是双引号""或者单引号''注意事项单引号与双引号不能混用,必须配对使用同类引......
  • 开源相机管理库Aravis例程学习(四)——multiple-acquisition-signal
    目录简介例程代码函数说明g_main_loop_newg_main_loop_rung_main_loop_quitg_signal_connectarv_stream_set_emit_signalsQ&A回调函数的同步调用与异步调用帧丢失问题简介本文针对官方例程中的:02-multiple-acquisition-signal做简单的讲解。并简单介绍其中调用的g_main_loop_new......
  • Javascript的数据类型和json数组
    4个数据类型:NumberStringBooleanUndefinedalert(parseInt(k));//如果不是数字会输出NaN,从第一个字符开始输出数字,直到不是数字后返回值。json数组://js中k、v型数据,使用jsonvarperson={name:"张三",//注意里面的元素用,分割。定义的是key是name的value值为张三age......