본문 바로가기

웹 보안

JWT 인증 우회

반응형

JWT 이해

JWT는 JSON Web Token의 약자로 system 간에 암호화된 JSON data를 전송하기 위한 표준화된 형식이다.
주로 인증, session 처리 및 Access 제어 메커니즘의 이룹로 사용자에 대한 정보를 전송할 때 사용한다.
Session token과 달리 server가 필요로 하는 모든 data는 전부 JWT 자체 내 client에 저장되게 된다.
 
HTTP의  Connectionless, Stateless 두 가지 특성으로 인하여
token, cookie, session들을 사용하게 된 것은 설명하지 않아도 알고 있을 것이다.
 
 
Connectionless: 일회성 통신, 한번 통신하면 바로 연결 끊기 (3-way -> 4-way handshaking)
Stateless: 이전 상태에 대한 정보를 저장하지 않음
 
 
이러한 배경 속에서 JWT는 확장되고 분산되어진 WEB 구조에서 편리하게 사용가능한 인증 방식이 되었다.
 
JWT의 구조는 크게 Header. Payload. Signature 로 구분되어 있으며, 
점(.)을 기준으로 정보들을 저장하는데 각각 다음과 같은 정보들을 내포하고 있다.

 

header, payload 부분은 base64url로 encoding된 JSON 객체다.

header: token 자체에 대한 meta-data 포함
payload: user에 대한 실제 claims가 포함
signature: header와 payload의 문자열을 합친 후, header에서 선언한 알고리즘과 key를 이용하여 암호화한 값

 
 
JWT의 취약점은 바로 JWT에 접근한 user 누구나 해당 token을 변조할 수 있다는  것이다.
따라서, JWT 보안은 암호화 서명에 크게 의존하게 되는데
이 때, 서버나 사용자 측에서 비밀 서명키를 생성하고 이를 암호화한다.
이제 이를 수신하게 된 쪽은 비밀 서명키를 모르면 특정 header or payload에 대한 올바른 서명을 생성할 수 없게 된다.
 
 
이제 이를 어떻게 우회할 수 있을까?
PortSwigger LAB에서 JWT Authentication Bypass를 통해 확인해보았다.
해당 LAB에서는 signature를 검증하지 않는 취약점을 가진 페이지이므로
단순 payload 변조를 통한 인증 우회를 시도할 수 있다.
LAB에서 주어진 계정을 가지고 로그인을 하면 다음과 같이 JWT를 전달하는 것을 확인할 수 있다.
 

 
 
JWT editor를 설치하여 JWT의 header,payload,signature 정보들을 확인해보자
 

 
 
이제 Payload의 sub의 value를 "wiener"에서 "administrator"로 변경하여 JWT 값을 변조하고
변조된 값을 바탕으로 일반 사용자가 접근할 수 없는 admin 페이지로 접근한다.
 
 

 
 

admin 페이지로 접근된 모습

 
 
이제 개발자 도구에서 JWT를 저장한 값을 administrator로 변조한 값으로 적용한 후,
/admin 페이지로 접근한다. 접근하면 밑의 그림과 같이 admin 권한으로 해당 페이지에 접근하게 된 것을 볼 수 있다.
 

 
 
 
 
출처
https://velog.io/@chuu1019/%EC%95%8C%EA%B3%A0-%EC%93%B0%EC%9E%90-JWTJson-Web-Token

velog

velog.io

 

반응형

'웹 보안' 카테고리의 다른 글

HTTP Smuggling  (0) 2024.06.07
MVC 패턴  (1) 2024.02.01
HTTP method status code  (0) 2023.11.08
Blind SQL injection  (0) 2023.02.06
Non-Blind SQL injection  (0) 2022.12.13