본문 바로가기

드림핵

[드림핵 워게임] pathtraversal

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

 

 

1. 기능 확인하기

첫 페이지는 위와 같다. Get User Info를 클릭해 접속해본다.

 

userid를 입력하는 창이 뜬다.

 

guest 계정에 대한 정보를 응답받았다.

 

 

 

2. 코드 분석하기

users = {
    '0': {
        'userid': 'guest',
        'level': 1,
        'password': 'guest'
    },
    '1': {
        'userid': 'admin',
        'level': 9999,
        'password': 'admin'
    }
}

코드를 살펴보면 계정정보를 확인할 수 있다. 1단계에서 응답받은 내용이 여기에 있는 계정 정보인 것을 알 수 있다.

 

@app.route('/get_info', methods=['GET', 'POST'])
def get_info():
    if request.method == 'GET':
        return render_template('get_info.html')
    elif request.method == 'POST':
        userid = request.form.get('userid', '')
        info = requests.get(f'{API_HOST}/api/user/{userid}').text
        return render_template('get_info.html', info=info)

Get User Info를 클릭해서 접속했던 /get info 엔드포인트에 대한 코드를 살펴보면, 이용자가 입력값을 입력했을 때 입력한 값을 POST요청으로 받아서 api/user/(입력값)의 경로로 값을 보내는 것을 확인할 수 있다.

 

@app.route('/api/flag')
@internal_api
def flag():
    return FLAG

플래그에 대한 코드는 위와 같은데, /api/flag 경로로 접속하면 flag를 리턴하는 것을 확인할 수 있다.

 

 

3. 버프 스위트를 활용해 path traversal 공격 시도하기

버프 스위트를 활용해 path traversal 공격을 시도해볼 것이다.

 

버프 스위트를 열고 처음 뜨는 창에 next, 그 다음 start를 클릭해서 프로젝트를 오픈한다.

메뉴바에서 proxy > intercept로 들어가고 intercept is off를 클릭해서 intercept is on으로 바꾼다.

 

그리고 proxy > options 메뉴를 클릭해서 Intercept Client Requests 에서 요소들을 모두 체크한다.

 

아래로 스크롤을 내리면 나오는 Intercept Server Responses에서도 모든 요소들에 체크한다.

 

다시 proxy > intercept로 들어가서 open browser를 클릭해 브라우저 창을 연다. 주소창에 /get_info 엔드포인트로 접속한 주소를 복사해서 붙여넣는다.

 

브라우저 창의 입력칸에 guest를 입력하고 view 버튼을 클릭하면 버프스위트의 proxy > HTTP history 에서 POST 요청 기록이 뜨는 것을 볼 수 있다. 해당 기록을 클릭하면 아래와 같이 Request와 Response 기록이 뜬다.

 

Request에서 우클릭하여 Send to Repeater를 클릭한다. 그리고 메뉴바의 Repeater로 들어가면 Request 값을 수정할 수 있다.

 

Request 내용에서 userid값이 0으로 되어있는 것을 확인할 수 있는데, 이것은 앞서 코드에서 살펴본 계정 정보(users) 딕셔너리에서 guest의 키가 0으로 되어 있는 것이 출력된 것이다. 이 부분에서 path traversal 공격을 할 것이다. userid의 값은 api/user/(입력값) 형태로 경로가 형성되는데, 우리가 얻고자 하는 flag는 api/flag 경로에서 리턴받을 수 있다. 따라서 입력값을 ../flag로 하여 api/user/../flag로 경로가 형성되도록 하면 api/flag로 이동할 수 있다.

 

 

 

4. 플래그 얻기

userid의 값을 ../flag로 하여 Send를 클릭해 요청을 보내면 Response의 Render페이지에서 플래그가 출력된 것을 확인할 수 있다.

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

[드림핵 워게임] Mango (조건 추가)  (1) 2022.10.08
[드림핵 워게임] Carve Party  (1) 2022.10.08
[드림핵 워게임] command injection-1  (1) 2022.10.08
[드림핵 워게임] Mango  (0) 2022.10.01
[드림핵 워게임] simple-sqli  (1) 2022.09.24