WebGoat - JWT (1)
WebGoat - JWT (1)
서버로부터 할당받은 토큰을 변조해 ‘admin’사용자가 되어 투표 현황 초기화하기
JWT(JSON Web Token)란 JSON 객체를 이용하여 정보를 안전하게 전달하고 신원 인증을 하는데 사용되는 토큰이다.
실제로 vote를 클릭하면 투표 수가 증가하는 것을 볼 수 있다. 하지만 reset을 클릭하니 ‘admin’사용자만 초기화할 수 있다고 한다.
reset버튼을 클릭한 후 Burp Suite를 통해 확인해보니 POST방식으로 데이터를 전달한다. 그리고 우리는 access_token 이라는 파라미터를 통해 전달한다고 예상할 수 있다.
참고로 JWT는 base64로 인코딩 되어있고, 3영역(header.claims.signature)으로 이루어져있으며 그 중 claims 영역을 통해 클라이언트 신원 관련 정보를 전달한다. 이제 access_token의 내용을 마침표를 기준으로 3영역으로 나눈 후 decoder를 통해 디코딩해보자.
claims 영역을 확인하니 다음과 같다.
"iat":1611985002,"admin":"false","user":"TomIn0"
이제 admin 사용자인 것처럼 조작하여 전송해보자.
"iat":1611985002,"admin":"true","user":"admin"
문제는 내용을 변경하면 별도의 서명이 필요한데 서명에는 암호키가 필요하고 암호키는 서버만이 알고있기 때문에 우리가 서명할 수 없다.
header부분에서 알고리즘을 변경하여 디지털 서명이 필요없도록 만들어보자.
"alg":"HS512" -> "alg":"none"
이제 header와 claims를 인코딩하여 전송하자.
{"alg":"none"}.
{"iat":1611985002,"admin":"true","user":"admin"}.
eyJhbGciOiJub25lIn0=.eyJpYXQiOjE2MTE5ODUwMDIsImFkbWluIjoidHJ1ZSIsInVzZXIiOiJhZG1pbiJ9.
결과적으로 투표 자체가 초기화되었다.