官方公众号企业安全新浪微博
FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。
FreeBuf+小程序
前言
接着前面详细的分析了在hessian中该API的运用原理,这里接着对下面几个进行分析
Kryo
原理
简单的对Kryo协议的介绍
Kryo 是一个快速高效的 Java 二进制对象图序列化框架。该项目的目标是高速、小尺寸和易于使用的 API。任何时候需要持久保存对象时,无论是保存到文件、数据库还是通过网络,该项目都很有用。 Kryo 还可以执行自动深浅复制/克隆。这是从对象到对象的直接复制,而不是对象到字节到对象的复制。
对于该协议的反序列化漏洞可以简单的将其分为5.0.0前的版本和之后的版本
对于5.0.0之前的版本来讲,他是可以在反序列化的的过程中调用目标类的无参构造方法的,也就是可以利用前面提到的UnixPrintServiceLookup
的构造方法的调用,进而最终能够调用到他的execCmd
方法执行命令(如果能够修改属性值)
我们简单的研究一下为什么能够调用构造方法
一个pojo类
public class User {
private String name;
private int age;
public User() {
System.out.println("User...");
this.name = "test";
this.age = 18;
}
public String getName() {
System.out.println("getName...");
return name;
}
public void setName(String name) {
System.out.println("getName...");
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
一个测试类
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
import java.io.ByteArrayOutputStream;
public class kryoTest {
public static void main(String[] args) {
Kryo kryo = new Kryo();
// kryo.register(User.class);
User user = new User();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
Output output = new Output(byteArrayOutputStream);
kryo.writeClassAndObject(output, user);
output.close();
Input input = new Input(byteArrayOutputStream.toByteArray());
User object = (User) kryo.readClassAndObject(input);
System.out.println(object.getName());
}
}
运行结果如下
在反序列化的过程中是调用了构造方法的
反序列的入口是在readClassAndObject
方法中