development-env

소스코드
index.js
- 59라인을 살펴보면 유효한 ID/PW 를 입력했을 때
User-Agent헤더 값에MSIE 혹은 Trident가 포함되면 에러가 발생하며 예외 처리가 발생하는 것을 확인할 수 있습니다. 캐치(catch)문으로 진입하면 예외 발생 구간에 대한 정보가 JSON 형태로 파싱되어 응답 값에 출력되는데요. 요기서 주목할 점은 60라인입니다.generateJWT함수에 의해 JWT가 생성되고 있는데 인자로 시크릿 키(“FAKE_KEY”) 값이 넘어가고 있기 때문에 이 값을 확인할 수 있다면 관리자 계정의 JWT 토큰을 발급하는 것도 가능할 것으로 보입니다.

- 실제로
guest/guestPW계정정보로 접속할 때, “User-Agent” 값을 “Trident”로 설정하여 예외 처리를 유발하면 서버로부터 반환되는 응답 값에 JWT 시크릿 키가 평문으로 노출되는 것을 확인할 수 있었습니다. (kitvP5j71fwycLz)

customcrypto.js
customcrypto.js파일은 JWT 생성, 검증, 읽기 등의 함수를 제공하고 있습니다.generateJWT함수를 보면 사용자의 계정명(ID)과 시크릿 키 값을 이용하여 JWT를 만들고 있습니다.- 시크릿 키 값(“kitvP5j71fwycLz”)은 이전 과정에서 획득했기 때문에
generateJWT함수 호출 시에userId값에admin이 들어가도록 변조만 해주면 되겠네요.

- 시크릿 키 값(“kitvP5j71fwycLz”)은 이전 과정에서 획득했기 때문에
index.js파일의 아래 부분을admin으로 수정한 뒤 로컬 환경에서express서버를 구동하였습니다.

- 로그인 해보면 JWT 토큰이 발급되는데, 요것이 바로 관리자 계정의 JWT 토큰입니다.
- `jwt = await cryptolib.generateJWT(“admin”, …“)

- `jwt = await cryptolib.generateJWT(“admin”, …“)
- 관리자 계정으로 로그인에 성공한 것을 볼 수 있습니다. 그럼 이제 이 JWT 토큰을 실제 서버에서 재사용해봅시다.

- 쨘,
guest계정으로 로그인해서 인덱스(/) 페이지로 진입할 때 요청 헤더(Cookie)의auth값을 관리자 토큰 값으로 변조해주면 관리자 계정으로 접속 후 플래그를 확인할 수 있습니다. (다만, 유효기간이 30초이므로 그 안에 사용해야 합니다.)

🐛.. 🐛.. 🐛..