문제 설명
여러 기능과 입력받은 URL을 확인하는 봇이 구현된 서비스입니다.
CSRF 취약점을 이용해 플래그를 획득하세요.
코드 분석

admin 계정 로그인 시 FLAG 획득
엔드 포인트: /vuln

- param의 값을 입력받고 그대로 반환한다.
- 이때 "frame", "script", "on"은 필터링되며 "*"으로 치환된다.
엔드 포인트: /flag

- 무작위 세션 id생성 후 16진수 문자열로 변환
- 세션 ID를 키로 사용하고, 'admin' 값을 session_storage에 저장
GET
: 이용자에게 URL을 입력받는 페이지 제공
POST
: param 파라미터 값을 가져온 뒤, session_id를 생성하고, 생성한 session_id를 키로 사용하여 admin값을 session_storage에 저장한다.
그 후 check_csrf()를 통해 session_id가 유효한지 확인하고 경고 메시지 반환
엔드 포인트: /login

GET
: 이용자에게 login.html 제공
POST
: username과 passwd 입력받고, pw와 비교한 후, 로그인 성공 시 index 페이지 리다이렉트하도록 응답객체(resp)를 생성.
나중에 사용자를 식별하는데 사용할 session_id를 생성하고 생성한 session_id로 session_storage에 사용자 이름을 저장한다.
세션을 설정하고 리다이렉트된 응답을 반환하여 사용자를 index 페이지로 리다이렉션 한다.
엔드포인트: /change_password

- GET 요청을 통해 pw가져와 pw에 저장함
- 브라우저에서 sessionid 가져오고 session_id에 저장
session_id를 사용해 로그인한 사용자 확인하고, session_id가 세션 저장소에 있지 않으면 'please login' 문구를 띄우고
'index.html'로 렌더링 해서 보여줌
users[username] = pw 세션을 통해 확인된 사용자의 비밀번호를 새로운 비밀번호로 변경
취약점 분석
/vuln 에서 이용자의 입력 값을 페이지에 출력한다.
frame, script, on 키워드는 필터링하기에 XSS 공격은 불가능하다.
다른 태그와 <,> 같은 키워드는 사용가능하기에 CSRF 공격이 가능하다.

익스플로잇
- /flag 페이지에서 admin의 session_id가 저장
- 공격 코드가 삽입된 /flag 페이지에서 admin의 pw를 변경하기 위해 /change_password 페이지를 접근
- CSRF로 /flag 페이지를 방문하는 이용자가 /change_password 페이지로 요청을 전송하도록 공격코드 작성
CSRF 공격 코드 작성
/flag 페이지에서 이용자가 /change_password 를 통해 admin의 pw 값을 바꿔야 하기 때문에 아래와 같이 코드 작성
<img src="/change_password?pw=1234">
로그인에 ID:admin / PW: 1234로 로그인하면 admin 계정으로 로그인 가능


'Dreamhack 워게임 > Lv.1' 카테고리의 다른 글
| {"role": "admin"} (0) | 2026.01.21 |
|---|---|
| simple_sqli (1) | 2026.01.15 |
| csrf - 1 (0) | 2026.01.11 |
| session-basic (0) | 2026.01.09 |
| XSS - 2 (0) | 2026.01.01 |