Erlo

JAVA安全学习 Day 1

2024-04-25 18:29:18 发布   7 浏览  
页面报错/反馈
收藏 点赞

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);

登录查看全部

参与评论

评论留言

还没有评论留言,赶紧来抢楼吧~~

手机查看

返回顶部

给这篇文章打个标签吧~

棒极了 糟糕透顶 好文章 PHP JAVA JS 小程序 Python SEO MySql 确认