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'
세 가지 취약점이 존재한다:
- 현재 비밀번호 확인 없음 → 세션만 있으면 누구나 변경 가능
- GET 파라미터로 pw 수신 → URL 방문만으로 비밀번호 변경 가능
- 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
