CTF

CSRF - 2

whffu0123 2026. 5. 27. 23:53

Dreamhack CSRF-2 Write-up


문제 개요

CSRF 취약점이 존재하는 웹 서비스에서, 관리자 계정의 비밀번호를 변경한 후 직접 로그인하여 FLAG를 획득하는 문제.

users = {
    'guest': 'guest',
    'admin': FLAG   # admin의 비밀번호 = FLAG
}

admin 비밀번호를 알 수 없으므로, CSRF를 통해 admin 비밀번호를 임의의 값으로 변경 후 로그인한다.


엔드포인트 분석

엔드포인트 설명

/vuln 사용자 입력값(param)을 화면에 출력. frame, script, on 키워드 필터링
/flag 입력받은 URL을 관리자 봇이 방문하게 함
/login username/password로 로그인. 성공 시 session_id 발급
/change_password 쿠키의 세션을 확인 후 비밀번호 변경 ← 핵심 공격 대상

취약점 분석

/change_password - 인증 없는 비밀번호 변경

pw = request.args.get("pw", "")              # 새 비밀번호를 GET 파라미터로 받음
session_id = request.cookies.get('sessionid', None)
username = session_storage[session_id]       # 세션으로 현재 유저 확인
users[username] = pw                         # 비밀번호 즉시 변경
return 'Done'

세 가지 취약점이 존재한다:

  1. 현재 비밀번호 확인 없음 → 세션만 있으면 누구나 변경 가능
  2. GET 파라미터로 pw 수신 → URL 방문만으로 비밀번호 변경 가능
  3. CSRF 토큰 없음 → 외부에서 요청을 위조할 수 있음

/vuln - img 태그 사용 가능

xss_filter = ["frame", "script", "on"]

img 태그는 필터링 대상이 아니므로 CSRF 공격 코드 삽입 가능.

/flag - 관리자 봇의 세션

관리자 봇은 admin으로 로그인된 상태로 URL을 방문한다.
→ 요청에 admin의 sessionid 쿠키가 자동으로 포함됨.


공격 흐름

1. /flag 페이지에 페이로드 제출 (POST)
        ↓
2. 관리자 봇이 아래 URL을 방문
   http://127.0.0.1:8000/vuln?param=<img src="/change_password?pw=hacked">
        ↓
3. /vuln에서 img 태그 렌더링
   → 브라우저가 /change_password?pw=hacked 로 자동 GET 요청
   → 관리자 봇의 쿠키(admin 세션)가 자동으로 포함됨
        ↓
4. /change_password 실행
   - session_storage에서 admin 확인 
   - users['admin'] = 'hacked' 으로 변경됨
        ↓
5. /login 에서 admin / hacked 로 로그인
        ↓
6. FLAG 획득

페이로드

<img src="/change_password?pw=hacked">
  • img 태그: 필터링 대상 아님 
  • /change_password: 상대경로 → http://127.0.0.1:8000/change_password 로 해석 
  • ?pw=hacked: admin 비밀번호를 hacked 로 변경 

풀이 단계

Step 1. /flag 페이지(GET) 접속 → 입력창 확인

Step 2. 입력창에 페이로드 입력 후 Submit

<img src="/change_password?pw=hacked">

Step 3. /login 접속 후 로그인

username: admin
password: hacked

Step 4. FLAG 확인

DH{c57d0dc12bb9ff023faf9a0e2b49e470a77271ef}

CSRF-1 vs CSRF-2 비교

CSRF-1 CSRF-2

목표 관리자 기능(FLAG 기록) 실행 관리자 비밀번호 변경 후 직접 로그인
공격 대상 엔드포인트 /admin/notice_flag /change_password
localhost 조건 있음 (127.0.0.1만 허용) 없음
결과 확인 방법 /memo 에서 FLAG 조회 /login 으로 직접 로그인
공격 방법 img 태그로 CSRF img 태그로 CSRF

핵심 포인트 정리

포인트 내용

CSRF 성립 조건 관리자 봇이 admin 세션 쿠키를 가진 채로 요청을 보냄
필터 우회 script 대신 img 태그 사용
비밀번호 변경 취약점 GET 파라미터 + CSRF 토큰 없음 + 현재 비밀번호 확인 없음

Flag

로그인 후 flag 확인

 

'CTF' 카테고리의 다른 글

Mango  (0) 2026.06.01
Simple SQLi  (0) 2026.05.29
CSRF - 1  (0) 2026.05.27
XSS - 2  (0) 2026.05.27
XSS - 1  (0) 2026.05.27