🎼个人主页:金灰
😎作者简介:一名简单的大一学生;易编橙·终身成长社群的嘉宾.✨
专注网络空间安全服务,期待与您的交流分享~
感谢您的点赞、关注、评论、收藏、是对我最大的认可和支持!❤️
🍊易编橙·终身成长社群🍊 : http://t.csdnimg.cn/iSLaP 期待您的加入~
免责声明:本文仅做分享~
目录
JAVA
java基础
java是一门编程语言
纯粹的 面向对象
类和类的方法
都存放在包,package中
java的web基于servlet --定义路由 ,
...
java的反序列化
序列化 类实例->字节流
反序列化 字节流->类实例
序列化 writeObject
反序列化 readObject
--自动调用
类要能序列化满足的条件:
1 实现java.io.Serializeble 接口
2 该类的所有属性必须都是可序列化,如果有一个属性是不可序列化的,那么这个属性必须注明是短暂的.
反序列化漏洞利用条件:
1 有反序列化接口,能够提交序列化的数据,会自动调用对应类的readObject方法.
2 有可以利用的类, readObject通过跳板,最终可以实现文件读取、写入或者执行.
例:
# 类
package com.ctf.entity;
public class User implements Serializable {
private static final long serialVersionUID = -3254536114659397781L;
private String username;
public User(String username) {
this.username = username;
}
public String getName(){
return this.username;
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
Runtime.getRuntime().exec(this.username);
}
}
//user = (User) objectInputStream.readUnshared();
---------------------------------------------------------------------------
+
public class BaseUser implements Serializable {
private static final long serialVersionUID = -9058183616471264199L;
public String secret=null;
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
Runtime.getRuntime().exec(this.secret);
}
}
user = (User) objectInputStream.readUnshared();
当不允许反序列化漏洞的类,可以反序列化子类,也可以反序列化父类.
User
BaseUser readObject
//反序列化父类
user = (User) safeObjectInputStream.readUnshared();
//强转
java反序列化总结:
1 需要有1个提交反序列化字节流的地方.
2 有可以被利用的类,存在 readObject 方法.
3 类反序列化后,类实例已不再关注,我们重点是执行了readObject方法.