- (A7) Identity & Auth Failure - JWT tokens2023년 10월 04일 14시 35분 21초에 업로드 된 글입니다.작성자: IIIIIIIIIIIIIIIIIIIIl
JWT(JSON Web Token) 토큰은 RFC 7519 open standard로서, JSON 포맷을 이용하여 사용자에 대한 속성 정보를 저장하는 방식이며, 사용자 인증이나 정보 교환에 사용됩니다.
1번 문제 소개
JWT 토큰 내에 저장되어 있는 user name을 알아내는 간단한 문제입니다. JWT 토큰은 base64 인코딩되어 있기 때문에, 아래와 같이 토큰 값을 base64로 디코딩하면 내용을 쉽게 알 수 있습니다.
2번 문제 소개
JWT 토큰을 변조하여 admin으로 로그인하고, 투표를 초기화시키는 문제입니다. 우선, proxy 도구를 사용하여 intercept를 on 시켜놓고, 사용자를 아래와 같이 Tom으로 변경합니다. (Guest 외에 다른 사용자 아무거나 선택하면 됨)
그러면 아래와 같이 서버로부터 생성된 JWT 토큰을 전달 받게 됩니다. 이 토큰의 내용을 복사해 둡니다.
해당 내용을 base64로 디코딩해보면 아래와 같은 정보를 얻을 수 있습니다.
이제, 위 텍스트 내용 중에서 일부를 활용하여, 아래와 같이 두 개의 스트링을 만듭니다.
- {"alg":null}
- {"iat":1688557336,"admin":"true","user":"admin"}
수정된 내용은 아래와 같습니다.
- “alg” 값을 null로 수정 (서명 알고리즘이 설정되지 않았을 때의 예외처리 미흡 취약점 활용 목적)
- “admin” 값을 “true”로 수정
- “user” 값을 “admin”으로 수정
이제 두 개의 스트링을 각각 base64로 인코딩한 후, JWT 토큰의 구분자인 .을 이용하여 아래와 같은 JWT 토큰을 생성합니다. (header 직후, 그리고 마지막에 .을 입력해야 하는 부분이 중요함)
eyJhbGciOm51bGx9.eyJpYXQiOjE2ODg1NTczMzYsImFkbWluIjoidHJ1ZSIsInVzZXIiOiJhZG1pbiJ9.
그리고 나서, 문제 웹페이지 상에서 휴지통 모양의 reset 버튼을 누르고, 이 때 Proxy 도구에 잡힌 access_token 값을 아래와 같이 수정한 후, 서버로 전송(Forward)합니다.
그 결과, 아래와 같이 문제가 해결되는 화면을 보실 수 있습니다.
3번 문제 소개
앞서 소개한 alg : none 문제점을 처리할 수 있는 대응 코드를 작성하는 부분과 관련된 코드 리뷰 문제입니다. 문제는 총 2개의 서브 문제로 구성되어 있는데, 두 개의 코드 snippet이 제시되어 있는 상황에서 alg : none이 왔을 때, 각각 어떻게 처리가 되는지를 묻고 있습니다.
두 개의 코드 상에서 다른 부분은 JWT 토큰을 파싱하는 로직 한 줄 뿐입니다.
- 첫 번째 코드 : Jwt jwt = Jwts.parser().setSigningKey(JWT_PASSWORD).parseClaimsJws(accessToken);
- 두 번째 코드 : Jwt jwt = Jwts.parser().setSigningKey(JWT_PASSWORD).parse(accessToken);
첫 번째 코드는 JWT 토큰에 서명값 없이 alg : none이 넘어오게 되면, 토큰 변조로 간주되어 exception을 발생시킵니다. 그러나, 두 번째 코드에서는 alg 값에 따라 인증을 수행하지 않고 그대로 코드가 진행되므로 claim 정보의 내용을 그대로 사용하여 admin값이 true라고 판단하고 코드가 수행이 됩니다. 그러므로, JWT 토큰 변조 여부를 확인하기 위해서는 parse()가 아닌, parseClaimsJws() 메소드를 사용해야 합니다.
4번 문제 소개
JWT 토큰의 서명값을 생성한 secret을 알아내고, 이를 이용하여 내의 username 값을 변경한 후 다시 서명을 생성하는 문제입니다. 본 문제를 통해 secret을 일반적으로 알려진 단어를 사용할 때의 위험성을 알 수 있습니다. 문제를 풀기 위하여, 우선 특정 단어 사전을 다운로드하고, 해당 단어사전 내의 단어를 secret으로 사용했을 때 서버로부터 받은 서명값과 동일한 서명값이 생성되었는지 확인하는 절차를 계속적으로 반복 수행합니다. 이 때 서명을 생성하고 비교하는 로직은 직접 작성하여 사용하거나 또는 hashcat과 같은 도구를 사용하면 됩니다.
'웹애플리케이션 해킹 > 해킹 실습하기' 카테고리의 다른 글
(A9) Security Logging Failures - Logging Security (0) 2023.10.04 (A7) Identity & Auth Failure - Secure Passwords (0) 2023.10.04 (A7) Identity & Auth Failure - Insecure Login (0) 2023.10.04 (A7) Identity & Auth Failure - Authentication Bypasses (0) 2023.10.04 (A3) Injection - SQL Injection (intro) (0) 2023.10.04 다음글이 없습니다.이전글이 없습니다.댓글