What time is it?

/register 경로에서 신규 계정을 등록하면 /welcome 경로로 리다이렉트 된다.
이 때, /welcome URL 에서는 계정들이 등록된 시간이 출력된다.


유저들이 생성된 시간은 register() 함수에서 65라인에 의해 설정된다. ( int(time.time()) )


계정이 생성된 시간은 /welcome 경로 접근 시 호출되는 welcome() 함수에서 재사용되며,
datetime.fromtimestamp(…) 함수에 의해 날짜, 시, 분, 단위로 변경된 후 출력된다.


플래그를 획득하기 위해서는 루트 경로(/)로 접근할 때 is_admin 값이 참이어야 한다.
이를 위해서는 current_user() 에 의해 반환되는 uname 값이 “admin” 이어야 한다.


current_user 함수를 살피면 리턴 값은 sess.verify_session(...) 함수에 의해 결정된다.
따라서, “sess.verify_session(…)” 반환 값이 “admin” 이어야 한다는 것을 알 수 있다.


verify_session(…) 함수를 보면 아래 조건을 만족해야 username 값이 반환된다.
34라인의 username, token 값은 요청패킷의 Cookie: session={username}.{created_at} 에 의해 결정된다.
(1) 조건문을 만족하기 위해서는 “admin” 계정의 created_at * 2026 값과 (1)에서 전달받은 {임의 시간} 이 일치해야 한다.
(2) “admin” 계정의 등록(register) 시간은 로그인 후에 /welcome 경로로 접속하면 확인할 수 있었다.

  • [05/02/2026, 13:08:12 UTC] admin님 환영합니다.
  • [05/02/2026, 13:08:25 UTC] soneg님 환영합니다.

여기서 계정을 등록할 때는 created_at 값이 저장되지만, session 값에서는 created_at * 26 값이 사용된다.
요청패킷의 session 값에서 확인한 soneg 계정의 created_at * 26 값은 3586621529530 였다.


admin, soneg 계정의 등록 시간은 13초가 차이난다.
따라서, admin 계정의 created_at 시간을 계산하면 ( 3586621529530 / 2026 ) - 13 이다.
여기서 token == created_at * 2026 값이 일치해야 하므로 2026을 곱해주면 3586621503192 가 된다.
이제 이 값을 아래와 같이 요청 헤더의 session 값으로 사용해주면 플래그 확인 가능하다.


🐛.. 🐛.. 🐛..