본문 바로가기

드림핵

[드림핵 워게임] cookie

<문제>

위의 문제를 다음과 같은 과정으로 풀어보았다.

 

 

1. 소스코드 다운로드

드림핵 문제 페이지에서 Description > File > Download 를 클릭하고 압축을 풀면 'app.py'이라는 파이썬 코드를 확인할 수 있다.

 

 

2. 코드 분석

users = {
    'guest': 'guest',
    'admin': FLAG
}

admin 계정으로 로그인에 성공하면 플래그를 얻을 수 있는 문제이므로 코드에서 계정과 관련되어 보이는 부분을 찾아보았다.

11~14행에 있는 users 변수가 계정에 대한 정보를 담고 있는 것을 확인할 수 있다. guest는 username, password 모두 guest인 것을 볼 수 있고, admin으로는 로그인에 성공하면 플래그를 얻을 수 있는 것으로 보인다.

 

 

문제에 있는 링크로 들어가면 welcome!이라고 써있는 페이지를 볼 수 있다. 여기에서 상단 메뉴바의 우측에 있는 Login을 클릭하면 위와 같은 로그인 페이지가 뜬다. 여기에 guest 계정으로 로그인해보았다.

 

 

guest 계정으로 로그인하니, Hello guest, you are not admin이라는 메시지를 볼 수 있다. 이 부분에 대한 코드는 16~21행에서 확인할 수 있다.

 

 

@app.route('/')
def index():
    username = request.cookies.get('username', None)
    if username:
        return render_template('index.html', text=f'Hello {username}, {"flag is " + FLAG if username == "admin" else "you are not admin"}')
    return render_template('index.html')

코드를 분석해보면 인덱스 페이지에서는 쿠키에 저장되어 있는 username값을 가져오는 것을 볼 수 있다. 그리고 if문에서 username 값에 따라 서로 다른 텍스트를 렌더링되는 페이지에 보여준다. 이때 username이 admin이면 플래그를 보여주는 것을 확인할 수 있다.

 

 

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    elif request.method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')
        try:
            pw = users[username]
        except:
            return '<script>alert("not found user");history.go(-1);</script>'
        if pw == password:
            resp = make_response(redirect(url_for('index')) )
            resp.set_cookie('username', username)
            return resp 
        return '<script>alert("wrong password");history.go(-1);</script>'

로그인 페이지에 대한 코드를 보면, 사용자가 입력한 username이 users(11~14행)에 저장되어 있는 password와 적절하게 대응될 때 if문 이하를 실행하는 것을 볼 수 있다. 36행에서는 로그인 시 입력한 username을 set_cookie() 함수를 이용해 cookie에 저장하고 있다. 인덱스 페이지에서는 이렇게 쿠키로 저장된 username이 그대로 사용자를 판별하는 데 쓰인다. 즉, username에 admin이 쿠키로 저장되어 있으면 인덱스 페이지에서는 admin으로 로그인에 성공한 것으로 간주하는 것이다.

 

 

3. 관리자 계정을 탈취하기 위해 쿠키 수정

개발자 도구를 열어 Application 탭에서 쿠키를 수정할 수 있다. username에 해당하는 Value를 admin으로 수정해주고 인덱스 페이지를 새로고침하면 플래그를 얻을 수 있다.

'드림핵' 카테고리의 다른 글

[드림핵 워게임] xss-2  (1) 2022.09.21
[드림핵 워게임] xss-1  (1) 2022.09.21
[드림핵 워게임] session-basic  (0) 2022.09.18
[드림핵 워게임] web-misconf-1  (0) 2022.09.16
[드림핵 워게임] devtools-sources  (0) 2022.09.16