문제 목표 및 기능 요약
해당 문제의 목표는 관리자 권한을 획득해 FLAG를 획득하는 것입니다. 문제에서는 다음 두 페이지를 제공합니다.
페이지설명
/ | 이용자의 username을 출력하고 관리자 계정인지 확인합니다. |
/login | username, password를 입력받고 로그인합니다. |
Figure1. 인덱스 페이지를 구성하는 코드
- 해당 페이지에서는 요청에 포함된 쿠키를 통해 이용자를 식별합니다. 만약 쿠키에 존재하는 username이 “admin”일 경우 FLAG를 출력합니다.
@app.route('/') # / 페이지 라우팅
def index():
username = request.cookies.get('username', None) # 이용자가 전송한 쿠키의 username 입력값을 가져옴
if username: # username 입력값이 존재하는 경우
return render_template('index.html', text=f'Hello {username}, {"flag is " + FLAG if username == "admin" else "you are not admin"}') # "admin"인 경우 FLAG 출력, 아닌 경우 "you are not admin" 출력
return render_template('index.html')
Figure2. 로그인 페이지를 구성하는 코드
GET
username과 password를 입력할 수 있는 로그인 페이지를 제공합니다.
POST
이용자가 입력한 username과 password 입력 값을 users 변숫값과 비교합니다. Figure3은 users 변수가 선언된 코드입니다. 코드를 살펴보면, 손님 계정의 비밀번호는 “guest”, 관리자 계정의 비밀번호는 파일에서 읽어온 FLAG 임을 알 수 있습니다
Figure3. users 변수가 선언된 코드
손님 계정의 비밀번호는 “guest”, 관리자 계정의 비밀번호는 파일에서 읽어온 FLAG 임을 알 수 있습니다.
취약점 분석
Figure1을 살펴보면 이용자의 계정을 나타내는 username 변수가 요청에 포함된 쿠키에 의해 결정되어 문제가 발생합니다. 쿠키는 클라이언트의 요청에 포함되는 정보로, 이용자가 임의로 조작할 수 있습니다. 서버는 별다른 검증 없이 이용자 요청에 포함된 쿠키를 신뢰하고, 이용자 인증 정보를 식별하기 때문에 공격자는 쿠키에 타 계정 정보를 삽입해 계정을 탈취할 수 있습니다.
익스플로잇
본 문제를 해결하기 위해서는 쿠키에 존재하는 username을 “admin” 문자열로 조작해야 합니다. Figure4와 같이 웹 브라우저의 개발자 도구를 사용하면 쿠키의 정보를 확인하거나 수정할 수 있습니다. 개발자 도구에 대한 자세한 내용은 [WHF]Tools: Browser DevTools 코스에서 확인할 수 있습니다.
username을 “admin”으로 변경해 서버에 요청하면 Figure5와 같이 FLAG를 획득할 수 있습니다.
실습에서는 해당 취약점을 이용하여 다른 계정의 권한을 획득할 수 있었습니다.
이러한 문제점은 세션을 사용해 해결할 수 있습니다. 세션은 인증 정보를 서버에 저장하고, 랜덤한 키를 클라이언트에게 발급합니다. 클라이언트는 해당 키를 포함해 서버에게 요청하고, 서버는 저장한 세션 키와 대응하는 클라이언트인지 확인하므로 안전한 서비스를 구현할 수 있습니다.
'KERT > WarGame' 카테고리의 다른 글
[dreamhack] Exercise: CSRF (0) | 2023.07.17 |
---|---|
[dreamHack] xss-1, xss-2 (0) | 2023.07.17 |
[dreamhack] Exercise: XSS (0) | 2023.07.16 |
[dreamhack] cookie (0) | 2023.07.16 |
[dreamhack] devtools-sources (0) | 2023.07.03 |