직렬화란?
Java에서의 직렬화 : 객체를 전송 가능한 형태로 만드는 것. 객체들의 데이터를 연속적인 데이터로 변형하여 stream을 통해 데이터를 읽도록 한다. 주로 객체들을 통째로 파일로 저장하거나 전송하고 싶을 때 사용
- 특정 클래스의 인스턴스 상태를 다른 서버로 전달하기 위해 JVM(JAva Virtual Machine) 메모리 상에서 실행되고 있는 인스턴스 정보를 바이트 코드로 복사하는 과정을 의미
- Java에서 객체를 생성 => 해당 객체는 메모리에 상주, 프로그램 실행 동안 필요에 따라 사용됨 => 프로그램이 종료되면 메모리에 있던 객체 사라짐
- 프로그램 사용하며 저장된 데이터를 재사용해야하는 경우 => 직렬화 과정 후 저장
- 객체 데이터를 네트워크를 통해 전송해야하는 경우 => 직렬화 과정 후 전송
역직렬화란?
직렬화된 파일등을 역으로 직렬화하여 다시 객체의 형태로 만드는 것. 저장된 파일을 읽거나 전송된 Stream 데이터를 읽어 원래 객체 형태로 복원
- 역직렬화 수행 중 공격자가 직렬화된 바이트 스트림 조작 or 임의의 바이트 스트림을 전송하여 공격 가능
바이트 스트림에 표시된 aced0005라는 문자열은 직렬화된 데이터 앞에 항상 나타나는 문자열로, 뒤에 오는 데이터가 직렬화된 데이터라는 것을 알려주는 매직 바이트이다.
총정리
역직렬화 취약점이란?
- 전송받은 데이터를 역직렬화하는 과정에서 데이터 무결성을 검증하지 않고 그대로 서버로 전달한다면, 원격 코드 실행이나 인젝션, 권한 상승과 같은 공격이 발생할 수 있다.
발생 이유?
- 웹사이트 소유자들이 역직렬화된 데이터를 검사하는 것으로 안전하다고 생각
- 개발자들이 역직렬화된 객체가 바이너리로 변환될 경우, 해독이 어려울 것이라고 생각
- 웹 사이트 각각의 고유 종속성으로 인해 악의적 데이터 입력 및 호출 예측이 어려움
방지 방법 ?
- 절대적으로 필요한 사항이 아니라면 사용자의 입력을 역직렬화의 입력으로 사용하지 말 것
- 반드시 역직렬화 이전에 무결성 검사
- 노출 여부를 조절할 수 있도록 커스터마이징된 직렬화 메소드 사용
https://flowarc.tistory.com/entry/Java-%EA%B0%9D%EC%B2%B4-%EC%A7%81%EB%A0%AC%ED%99%94Serialization-%EC%99%80-%EC%97%AD%EC%A7%81%EB%A0%AC%ED%99%94Deserialization
https://cybersecuritykong.tistory.com/18
https://com-on-bappool.tistory.com/109
https://jhyuxxk.tistory.com/14
'개념정리 > WEB Hacking 개념 정리' 카테고리의 다른 글
역직렬화 취약점 (0) | 2022.03.06 |
---|---|
XSS 구분 & 공격 구문 (0) | 2022.03.02 |
http Header (0) | 2022.02.23 |
JWT 개념 정리 (0) | 2022.02.11 |