위의 문제를 다음과 같은 과정으로 풀어보았다.
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 |