[Web] Web · 작성: 2026-07-19 19:15:17 · 조회 2
역직렬화는 저장되거나 전송된 데이터(바이트/문자열)를 다시 객체로 복원하는 과정이다. 이 과정에 신뢰할 수 없는 입력이 들어가면, 단순 데이터 복원을 넘어 객체 생성자·소멸자·매직 메서드가 공격자 의도대로 실행되면서 임의 코드 실행으로 이어질 수 있다.
unserialize()에 사용자 입력을 직접 넣는 경우. 클래스에 __wakeup, __destruct 같은 매직 메서드가 있으면 역직렬화 시점에 자동 호출되어, 이를 체이닝해서 임의 코드 실행까지 만드는 걸 "POP 체인(Property-Oriented Programming)"이라 부른다.ObjectInputStream.readObject()로 신뢰할 수 없는 바이트 스트림을 역직렬화. 클래스패스에 있는 가젯 체인(Apache Commons Collections 등 유명 라이브러리)을 이용한 공격이 다수 알려져 있다.pickle.loads()는 문서에도 명시되어 있듯 신뢰할 수 없는 데이터에 쓰면 안 된다. __reduce__ 메서드를 이용해 임의 함수 호출을 실행시킬 수 있다.node-serialize 같은 일부 라이브러리는 함수 자체를 문자열로 직렬화했다가 eval로 복원하는 방식이라 구조적으로 위험하다. (표준 JSON.parse는 함수를 직렬화하지 않으므로 이 클래스의 문제에서 상대적으로 안전하다.)aced0005로 시작하는 매직 바이트, PHP는 O:8:"ClassName" 같은 패턴이 보이면 역직렬화 대상이다.ysoserial, PHP는 대상 코드에서 직접 가젯 체인을 분석해서 페이로드 생성 도구로 자동화하는 경우가 많다.ObjectInputFilter, look-ahead deserialization 등).