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이 들어가도록 변조만 해주면 되겠네요.

  • index.js 파일의 아래 부분을 admin 으로 수정한 뒤 로컬 환경에서 express 서버를 구동하였습니다.

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

  • 관리자 계정으로 로그인에 성공한 것을 볼 수 있습니다. 그럼 이제 이 JWT 토큰을 실제 서버에서 재사용해봅시다.

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

🐛.. 🐛.. 🐛..



REFERENCE

  1. https://velog.io/@kaitlin_k/cookie-%EC%98%B5%EC%85%98