JWT란 JSON 웹 토큰(Web Token)의 약자이며 암호화된 토큰값으로 JSON 데이터를 주고 받을 때 사용한다.
모든 JSON 데이터를 다 주고 받고 할 수 있지만,
일반적으로 JWT를 사용하는 웹 서버를 보면 보통 세션을 대신하는 기능으로
사용자의 권한을 검증하는 데 사용된다.
JWT는 아래 사이트에서 복호화해볼 수 있는데
헤더
페이로드
서명
세 개의 영역으로 구성된다.
헤더와 페이로드 영역인
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ. 부분은
단지 BASE64로 인코딩된 영역이다. 알다시피 base64는 누구나 쉽게 인코딩 디코딩할 수 있고 변조 또한 쉽다
그래서 JWT는 아래 암호화 서명에 모든 보안기능이 달려있다.
반대로 말하면 이 모든 보안기능을 담당하는
암호화 서명을 무력화시킬 수 있다면 사용자의 원래 권한이 아닌 권한 상승 공격이나 타 사용자로 위장하거나 하는 세션과 관련된 공격을 할 수 있다는 말이다.
JWT를 사용하는 서버를 확인하는 법은 간단하다.
Burp 익스텐더에 보면 "JSON Web Tokens"라는 툴이 있다.
이 툴을 설치하게되면
패킷 내 JWT가 발견되면 자동으로 인식되어 패킷 캡처 내 새로운 탭이 생성고
History탭에는 JWT가 포함되어있다고 하이라이트 표시까지 해준다.
아니면 세션값이 뭔가 길고 eyJ로 시작한다면 거의 무조건 JWT라고 볼 수 있다.
이 JSON Web Tokens 익스텐더 기능을 클릭하게 되면 아래와 같은 헤더 페이로드 서명 영역을 확인할 수 있다.
어떤식으로 공격이 이뤄지는지 기본을 살펴보자면
일단 해당 JWT값으로 /admin 경로에 접근을 하게되면 접근이 불가하다고 한다.
위의 JWT 내 sub 헤더에 사용자의 이름이 wiener라고 담겨져있다.
이를 administarator 로 변조한 후 전송하게되면 서버에서 관리자의 JWT로 인식하여 접근이 가능하게된다.
이런 간단한 JWT 변조가 가능한 이유는 서버에서 서명값을 제대로 검증하지 않아
확인되지 않은 임의의 JWT도 서버에서 응답하기 때문이다.
또 다른 기본적인 공격 방법이 있다.
이번에도 똑같이 sub헤더에 관리자 이름을 넣어줬지만 권한이 없다는 응답이 돌아오는 것을 볼 수 있다.
이는 서버에서 서명을 할 때 어떤 알고리즘이 사용되었는지 서명을 확인할 때 어떤 알고리즘을 사용해야하는 지 알려주는
헤더 영역을 확인하여 변조된 것을 서버에서 확인했기 때문이다.
하지만 서명 알고리즘이 비워서 검증할 수 없도록 이를 우회하는 공격 방법이 있다.
알고리즘 none Attack 이라는 이름으로 JSON Web Tokens 툴에서 제공된다.
똑같이 administrator로 변조 후 알고리즘 헤더만 none으로 보내면
서버에서는 제대로 검증을 하지 못하며 사용자의 권한 상승을 허가해준다.
alg None attack 기능을 보면 none, None nOnE NONE 등 다양한 형태의 none 문자열이 있는데
이유는 사실 대부분의 서버에서는 이러한 alg none Attack을 거부하고 막는다.
하지만 결국 필터링으로 거부하는것이기 때문에 XSS 공격의 우회 기법 처럼
nOne 이나 NoNE 이나 여러 인코딩 방식으로 필터링을 우회할 수 있기에 4가지 선택지가 존재하는 것이다.
JWT 공격 2편
2022.07.14 - [웹] - [웹] JWT(JSON Web Token)에 대한 다양한 공격 기법 - 2 (Feat. Hashcat)
'웹' 카테고리의 다른 글
[웹] JWT(JSON Web Token)에 대한 다양한 공격 기법 - 3 (0) | 2022.07.14 |
---|---|
[웹] JWT(JSON Web Token)에 대한 다양한 공격 기법 - 2 (Feat. Hashcat) (0) | 2022.07.14 |
[Web] 불충분한 인증 및 인가(파라미터 변조 취약점)에 대해 (0) | 2022.07.13 |
[웹] 파일 업로드 공격 - 확장자 우회 (0) | 2022.07.06 |