티스토리 뷰

728x90
반응형

문제 정보

 

 

 

접속 시 나타나는 화면

 

 

Create Session Page

 

 

 

Check Session Page

 

 

 

세션을 생성하고 생성된 세션을

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}

728x90
반응형

'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
링크
«   2026/01   »
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
글 보관함