티스토리 뷰
스물한 번째 글.
1. Serialization & Deserialization
serialization : Object 또는 Data의 상태 또는 타입을 특정한 형태의 포맷을 가진 데이터로 변환하는 것 -> pickling
deserialize : 직렬화된 데이터를 원래의 Object 또는 Data의 상태 또는 타입으로 되돌리는 것 -> unpickling
<직렬화를 하는 이유?>
간단하게 말하면 데이터를 파일에 저장하거나 네트워크를 통해 바이트 형태로 변환한 후 전송을 하기 위해서 이다.
2. Pickle module?
pickle moudule은 텍스트 이외의 자료형들을 파일로 저장하기 위해서 사용되는 파이썬 모듈이다.
3. Pickle module analysis
3.1 Module interface
pickle.dump : 객체 obj의 피클 된 표현을 열린 파일 객체 file에 쓴다
pickle.dumps : 객체 obj의 피클 된 표현을 파일에 쓰는 대신 bytes 객체로 리턴
pickle.load : 열린 파일 객체 file에서 객체의 피클 된 표현을 읽고, 그 안에 지정된 객체 계층 구조를 재구성하여 리턴
pickle.loads : 객체의 피클 된 표현 data의 재구성된 객체 계층 구조를 리턴
3.2 How it works?
data라는 dictionary를 만들고 pickle 모듈을 이용해 직렬화를 한 뒤 알아보기 쉽게 pickletools를 이용했다.
0 : PROTO 3 >> 프로토콜의 버전을 나타내는 것, 파이썬의 버전이라고 생각하면 된다.
2 : EMPTY_DICT >> empty 한 list를 만들고 이를 stack에 올린다.
3 : BINPUT [idx] >> 위의 list를 스택의 0번째에 올린다.
5 : MARK >> 스택에서 list의 시작을 의미
6 : BINUNCODE ['str'] >> 바이너리로 표현된 것을 유니코드로 변환하여 스택에 넣는다.
80 : SETITEMS (MARK at 5) >> 5번째에 있는 MARK를 기준으로 stack에 있는 key와 value를 list에 넣는다.
직렬화된 데이터를 print 해보면
b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x03\x00\x00\... 이런 식으로 찍히게 된다.
4. Why is this vulnerable?
4.1 object.__reduce__()
reduce 메소드는 파이썬 객체를 unpickling 할 때 객체를 재구성하는 것에 대한 tuple을 반환해주는 메서드이다.
reduce 메서드에서 반환되는 tuple은 다음과 같이 구성된다.
1. 호출가능한 객체(호출할 클래스의 이름) |
2. 호출가능한 객체에 대한 인자. (호출가능한 객체가 인자를 받아들이지 않으면 빈 tuple을 제공해야한다.) |
reduce 메서드를 이용하게 되면 내부적으로 스택에서 호출 가능한 객체가 있으면 인수와 함께 가져와서 실행을 해주는데
객체에 대한 검증 없이 실행을 해주기 때문에 취약점이 발생한다고 한다.
만약 여기서 악의적인 공격자가 원하는 명령어를 실행하게 된다면 문제가 발생할 것이다.
공식문서에서도 아래와 같이 pickle module은 안전하지 않다고 경고한다.
4.2 Example
만약 remote 서버 안에 저렇게 secret_value가 담겨 있으면 충분히 RCE(Remote Command Execution)가 가능하게 되고
해커가 원하는 결과를 얻을 수 있게 된다.
Reference
docs.python.org/ko/3/library/pickle.html
rootable.tistory.com/entry/python-deserialize-vulnerability-in-pickle-module
'study > web' 카테고리의 다른 글
[web] XXE Injection Advanced (0) | 2022.03.09 |
---|---|
[web] XXE Injection (0) | 2022.03.06 |
[web] DOM Clobbering (0) | 2021.01.28 |
[web] About CSP (2) | 2021.01.14 |
- Total
- Today
- Yesterday
- dreamhack padding oracle
- blind injection
- 해커팩토리
- htb
- xxe injection
- htb Windows Fundametals
- 드림핵 Relative Path Overwrite
- CSS Injection
- alasql
- 드림핵
- 드림핵 padding oracle
- Lord of SQL injection
- php LFI
- dreamhack Relative Path Overwrite
- webhacking.kr
- hackerfactory
- 드림핵 DOM XSS
- csp bypass
- DreamHack
- 웹해킹
- LFI vulnerability
- dreamhack CSS Injection
- wargame
- WebHacking
- dreamhack web-alasql
- hack the box
- Windows Fundamentals
- SQL Injection
- csp
- dreamhack DOM XSS
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |