pickle이란?
일반 텍스트를 파일로 저장할 때는 파일 입출력을 이용한다.
하지만 리스트나 클래스같은 string이 아닌 자료형은 일반적인 파일 입출력 방법으로는 데이터를 저장하거나 불러올 수 없다.
파이썬에서 이같이 string(텍스트)이외의 자료형을 파일로 저장하기 위해 pickle 모듈을 제공했다.
- import pickle
- pickle을 이용하면 원하는 데이터를 자료형 변환없이 파일로 저장했다가 그대로 로드할 수 있다.
- pickle로 데이터를 저장하거나 불러올 때는 파일을 byte 형식으로 읽거나 써야한다.(wb, rb)
- wb로 데이터를 입력할 때는 .bin 확장자를 사용하는게 좋다.
- 모든 파이썬 데이터 객체를 저장하고 읽을 수 있다.
- json dump, load와 유사하게 pickle dump, load 해서 쓰고 읽는다.
import pickle
arr=['a','b','c']
with open('./test.txt', 'wb') as f:
pickle.dump(arr, f)
import pickle
with open("./test.txt", 'rb') as f:
data = pickle.load(f)
print(data)
pickle 취약점
__reduce__ 는 파이썬 객체를 unpickling 할 때 객체를 재구성하는 것에 대한 tuple을 반환해준다.
반환되는 tuple은 다음과 같이 구성된다.
1. 호출가능한 객체(호출할 클래스의 이름)
2. 호출가능한 객체에 대한 인자(호출가능한 객체가 인자를 받아들이지 않으면 빈 tuple을 제공해야한다.)
reduce 메서드를 이용하게되면 내부적으로 스택에서 호출 가능한 객체가 있으면 인수와 함께 가져와서 실행을 해주는데 객체에 대한 검증없이 실행을 해주기 때문에 취약점이 발생한다.
만약 여기서 악의적인 공격자가 원하는 명령어를 실행하게 된다면 문제가 발생할 것이다.
import pickle
FLAG="FLAG{qwerty}"
class ex():
def __reduce__(self):
p = "FLAG"
return (eval, (p,))
payload = pickle.dumps(ex())
print(pickle.loads(payload))
https://wayhome25.github.io/cs/2017/04/04/cs-04/
'정보보안 > 웹해킹' 카테고리의 다른 글
[PortSwigger] CSRF where token is not tied to user session (0) | 2021.10.16 |
---|---|
[PortSwigger] CSRF where token validation depends on token being present (0) | 2021.10.16 |
[PostSwigger] CSRF where token validation depends on request method (0) | 2021.10.16 |
[PortSwigger] CSRF vulnerability with no defenses (0) | 2021.10.16 |
HTTP 메서드 OPTIONS, HEAD (0) | 2021.10.07 |
댓글