티스토리 뷰





세션을 생성하고 생성된 세션을
check session 넣어보면, 생성할 때 입력했던 정보들이 출력된다.
#소스코드
#!/usr/bin/env python3
from flask import Flask, request, render_template, redirect
import os, pickle, base64
app = Flask(__name__)
app.secret_key = os.urandom(32)
try:
FLAG = open('./flag.txt', 'r').read() # Flag is here!!
except:
FLAG = '[**FLAG**]'
INFO = ['name', 'userid', 'password']
@app.route('/')
def index():
return render_template('index.html')
@app.route('/create_session', methods=['GET', 'POST'])
def create_session():
if request.method == 'GET':
return render_template('create_session.html')
elif request.method == 'POST':
info = {}
for _ in INFO:
info[_] = request.form.get(_, '')
data = base64.b64encode(pickle.dumps(info)).decode('utf8')
return render_template('create_session.html', data=data)
@app.route('/check_session', methods=['GET', 'POST'])
def check_session():
if request.method == 'GET':
return render_template('check_session.html')
elif request.method == 'POST':
session = request.form.get('session', '')
info = pickle.loads(base64.b64decode(session))
return render_template('check_session.html', info=info)
app.run(host='0.0.0.0', port=8000)
[ pickle 모듈 ]
- python의 pickle 모듈의 객체 구조의 직렬화와 역 직렬화를 위한 바이너리 프로토콜을 구현하기 위해 사용
| pickling (= Serialization) : 파이썬 객체 계층 구조 -> 바이트 스트림 unpickling (= Desrialization) : 바이트 스트림 -> 파이썬 객체 계층 구조 |
*pickle 모듈의 인터페이스
pickle.dump : 객체 obj의 피클 된 표현을 열린 파일 객체 file에 쓴다
pickle.dumps : 객체 obj의 피클 된 표현을 파일에 쓰는 대신 bytes 객체로 변환
pickle.load : 열린 파일 객체 file에서 객체의 피클 된 표현 읽고, 그 안에 지정된 객체 구조를 재구성해 반환
pickle.loads : 객체의 피클 된 표현 data의 재구성된 객체 계층 구조 반환
[ pickle 모듈 diserialization 취약점 ]
__reduce__() 메소드에서 취약점 발생
__reduce__() : 파이썬 객체 계층 구조를 unpickling 할 때 객체를 재구성하는 것에 대한 tuple을 반환하는 메소드
| <리턴 값 2개의 인자> 호출 가능한 객체 (보통 호출할 클래스의 이름) 호출가능한 객체에 대한 인자 (호출 가능한 객체가 인자를 받아들이지 않으면 빈 tuple을 제공해야 함) |
이때 호출 가능한 객체에 eval 혹은 os와 같이 명령어를 실행할 수 있는 클래스를 임의로 지정 가능하다면,
RCE와 같은 취약점 발생 가능
이 문제는
__reduce__() 함수를 이용해 ./flag.txt 파일을 읽어야 한다.


name, userid, password를 사용해 세션을 생성해서
생성한 세션을 Check Session에 넣어본다.

그러면 내가 생성한 name, userid, password가 정상적으로
출력되는 것을 확인 할 수 있다.


그렇다면 flag.txt 파일을 읽어오고

읽어온 세션을 확인하면 flag가 출력된다.
DH{a6daba2e0cc5b22fed1aaf44d10a45a0}
'Wargame > Web' 카테고리의 다른 글
| [Dreamhack.io] baby-sqlite (0) | 2022.11.23 |
|---|---|
| [Dreamhack.io] Login-1 (0) | 2022.08.03 |
| [Dreamhack.io] Simple_sqli (0) | 2022.08.03 |
| [Dreamhack.io] Tmitter (0) | 2022.08.01 |
| [Dreamhack.io] Counting query (0) | 2022.08.01 |
- Total
- Today
- Yesterday
- 해킹
- rev
- reversing
- 포렌식
- web
- Fiesta
- 안드로이드
- CTF
- forensics
- 드림핵
- 모바일
- cheatengine
- 스테가노그래피
- MISC
- md5
- sqlinjection
- SQLi
- AssaultCube
- 취약점
- mongodb
- Cookie
- 인시큐어뱅크
- FTKImager
- Steganography
- Android
- networking
- 리버싱
- forensic
- dreamhack
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |