반응형
문제 설명
Topic: Authorization
분야: Web
난이도:Easy
But you start from a guest!
코드 분석

- cookieParser와 express.urlencoded 등록
- users를 new Map()으로 설정
- setInterval로 10분마다 초기화해 로그 출력

- username 쿠키를 읽어서 users Map에서 사용자를 찾고 없으면 /login 리다이렉트
- 있으면 req.user에 저장 후 next()
- 서명/무결성 검증이 없음

- 회원 가입 폼 HTML 반환. 입력 필드는 username, password, nickname

- req.body를 user_data로 사용
- username, password 존배 여부, username/nickname의 소문자+숫자 검증 후 진행
- 중복 username 있으면 오류
- 신규 유저를 role:"guest", ...user_data로 저장 후 username 쿠키 설정
- /로 리다이렉트. 스프레드 덮어쓰기로 클라이언트 필드가 우선

- 로그인 폼 HTML 반환

- req.body에서 username/password 추출, Map에서 조회 후 평문 비교.
- 실패 시 invalid credentials. 성공 시 username 쿠키 설정 후 / 리다이렉트

- auth 미들웨어로 보호
- req.user에서 username/role/nickname 출력
- role === admin 이면 FLAG를 <b>로 표시
- /logout 링크 제공

- username 쿠키 삭제 후 /login 리다이렉트
취약점 분석

- 인증은 서명이나 토큰 없이 username 쿠키만 보고 Map에서 유저를 찾음
- 가입 시 이미 username 쿠키를 설정해줌
- 관리자 계정만 만들면 바로 관리자 권한이 됨 → 쿠키 위/변조나 도용을 막을 장치가 전혀 없음

- username과 nickname만 검증
- 나머지 필드 제한 없음 → 임의 필드 삽입이 가능

- {role:"guest"} 위에 req.body(=user_data)를 스프레드로 덮어쓴다.
- 스프레드 뒤에 오는 값이 앞을 overwrite 함
- 클라이언트가 role=admin을 body에 넣어 보내면 role="guest"가 role="admin"으로 바뀜
위에서 username과 nickname만 검증하고 role필드는 막지 않기에 가능
익스 플로잇
curl -i -c c.txt \
-d "username=admin1&password=pass&nickname=aa&role=admin" \
http://34.170.146.252:64344/register
- -i : 응답의 헤더까지 같이 출력(리다이렉트, Set-Cookie 등을 보기 위해서)
- -c c.txt: 서버가 내려주는 쿠키를 c.txt 파일에 저장
- -d " ... " : POST 본문을 이렇게 보냄. 기본 폼 인코등(application/x-www-form-unlencoded)으로 전송되며, 여기서 role=admin을 끼워 넣어 관리자 계정을 만듦
- http://~~~/register: 요청을 보낼 URL
이 명령으로 /register에 필요한 필드와 role=admin을 함께 보내 관리자 계정을 만들고, 응답으로 Set-Cookie:username=admin1
을 c.txt에 저장함

그다음
curl -b c.txt http://34.170.146.252:64344/
curl -H "Cookie: username=admin1" http://34.170.146.252:64344/
curl -b c.txt http://~~~/
: 전에 -c c.txt로 저장한 쿠키 파일을 읽어 요청에 실음
URL /에 GET 요청. 가입 때 받은 username 쿠키가 포함되므로 로그인된 상태로 접속하는 단계
curl -H "Cookie: username=admin1" http://~~~/
: -H "Cookie: ...": 쿠키 헤더를 직접 써서 보냄. 쿠키 파일 없이도 특장 값(username=admin1)을 실어 보냄
역시 /에 GET 요청. 헤더에 넣은 username 기준으로 인증 시도

플래그 획득
반응형
'Alpacahack' 카테고리의 다른 글
| Alpacahack: Stateless Auth (0) | 2026.01.25 |
|---|---|
| Alpacahack: Animal Viewer (0) | 2026.01.22 |
| Alpacahack: dice roll (0) | 2026.01.21 |
| Alpacahack: secret-table (0) | 2026.01.20 |
| Alpacahack: Fushigi Crawier (0) | 2026.01.19 |