htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요! HackTricks를 지원하는 다른 방법: * **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요! * [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요. * [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다. * 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)을 **팔로우**하세요. * **Hacking 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
이 포스트에서는 `java.io.Serializable`을 사용한 예제를 설명합니다. # Serializable Java `Serializable` 인터페이스 (`java.io.Serializable`)는 클래스가 **직렬화** 및 **역직렬화**되어야 하는 경우 구현해야 하는 마커 인터페이스입니다. Java 객체 직렬화(쓰기)는 [ObjectOutputStream](http://tutorials.jenkov.com/java-io/objectoutputstream.html)를 사용하고 역직렬화(읽기)는 [ObjectInputStream](http://tutorials.jenkov.com/java-io/objectinputstream.html)를 사용하여 수행됩니다. **직렬화 가능한** **Person 클래스**를 사용한 예제를 살펴보겠습니다. 이 클래스는 **readObject 함수를 덮어씁니다**. 따라서 이 **클래스**의 **어떤 객체**가 **역직렬화**될 때 이 **함수**가 **실행**됩니다.\ 예제에서는 Person 클래스의 readObject 함수가 그의 애완동물의 eat() 함수와 Dog의 eat() 함수를 호출하고 (어떤 이유로) calc.exe를 호출합니다. **Person 객체를 직렬화하고 역직렬화하여 이 계산기를 실행하는 방법을 살펴보겠습니다:** **다음 예제는 [https://medium.com/@knownsec404team/java-deserialization-tool-gadgetinspector-first-glimpse-74e99e493649](https://medium.com/@knownsec404team/java-deserialization-tool-gadgetinspector-first-glimpse-74e99e493649)에서 가져온 것입니다.** ```java import java.io.Serializable; import java.io.*; public class TestDeserialization { interface Animal { public void eat(); } //Class must implements Serializable to be serializable public static class Cat implements Animal,Serializable { @Override public void eat() { System.out.println("cat eat fish"); } } //Class must implements Serializable to be serializable public static class Dog implements Animal,Serializable { @Override public void eat() { try { Runtime.getRuntime().exec("calc"); } catch (IOException e) { e.printStackTrace(); } System.out.println("dog eat bone"); } } //Class must implements Serializable to be serializable public static class Person implements Serializable { private Animal pet; public Person(Animal pet){ this.pet = pet; } //readObject implementation, will call the readObject from ObjectInputStream and then call pet.eat() private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException { pet = (Animal) stream.readObject(); pet.eat(); } } public static void GeneratePayload(Object instance, String file) throws Exception { //Serialize the constructed payload and write it to the file File f = new File(file); ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(f)); out.writeObject(instance); out.flush(); out.close(); } public static void payloadTest(String file) throws Exception { //Read the written payload and deserialize it ObjectInputStream in = new ObjectInputStream(new FileInputStream(file)); Object obj = in.readObject(); System.out.println(obj); in.close(); } public static void main(String[] args) throws Exception { // Example to call Person with a Dog Animal animal = new Dog(); Person person = new Person(animal); GeneratePayload(person,"test.ser"); payloadTest("test.ser"); // Example to call Person with a Cat //Animal animal = new Cat(); //Person person = new Person(animal); //GeneratePayload(person,"test.ser"); //payloadTest("test.ser"); } } ``` ## 결론 이 매우 기본적인 예제에서 볼 수 있듯이, "취약점"은 여기에서 **readObject** 함수가 **다른 취약한 함수를 호출**하기 때문에 발생합니다.
htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요! HackTricks를 지원하는 다른 방법: * **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요! * [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요. * 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family)인 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. * 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)를 **팔로우**하세요. * **HackTricks**와 **HackTricks Cloud** github 저장소에 PR을 제출하여 여러분의 해킹 기교를 공유하세요.