JAVA-JWT简介、原理、组成、过程、利用、工具
JAVA-JWT简介、原理、组成、过程、利用、工具
目录
9.1、The JSON Web Token Toolkit v2
一、前言:
谈起web安全,不得不想起以下内容(JAVA)
(1)基操
SQL注入、路径遍历、XSS跨站、反序列化、XML&XXE、CSRF&SSRF
(2)访问控制
对象引用、缺少功能
(3)身份验证
身份验证绕过、JWT令牌、重设密码、安全密码
(4)客户端安全
前端限制、客户端过滤、HTML修改
(5)组件安全
中间件
二、JWT(JSON Web令牌)简介:
JSON web Token 一种跨域验证身份的方案。JWT不加密传输的数据,通过数字签名来验证数据未被篡改(无状态的认证机制),通常用于授权和信息交换。
— — — — — —
重要性:JWT不仅是让你获得无限访问权限的关键,而且还被视为隐藏了通往以下特权的途径:特权升级,信息泄露,SQLi,XSS,SSRF,RCE,LFI等
— — — — — —
JWT的测试过程取决于不同JWT配置和实现,对目标服务的Web请求中使用的Token进行读取,篡改和签名,可能遇到已知的利用方式以及潜在的安全漏洞和配置错误
三、优点:
大小:由于JSON的详细性小于XML,因此编码其大小也小时也小,使JWT比SAML更紧凑。这使JWT成为在HTML和HTTP环境中通过的好选择。
— — — —
安全:SWT只能通过使用HMAC算法的共享秘密对称签名。但是,JWT和SAML令牌可以使用X.509证书的形式使用公共/私钥对进行签名。与签名JSON的简单性相比,使用XML数字签名签名XML没有引入晦涩的安全孔,这是非常困难的。
— — — —
断言:JSON解析器在大多数编程语言中都是常见的,因为它们直接映射到对象。相反,XML没有自然的文档对象映射。这使与JWT合作比SAML断言更容易。
— — — —
份额:JWT在Internet规模上使用。这突出了JSON Web令牌在多个平台(尤其是移动设备)上的客户端处理的便捷性。
四、原理:
通过数字签名来验证数据未被篡改,可以被验证和信任
JWT 三部分:头部(Header).声明(Claims).签名(Signature)
三个部分以英文句号.隔开,JWT 的内容以 Base64URL 进行了编码
— — — —
(1)可以使用secret(HMAC算法)或使用“RSA或ECDSA的公用/私有key pair密钥对”对JWT进行签名。
(2)signed tokens(已签名的令牌)可以验证其中包含的claims(声明)的完整性
(3)encrypted tokens(加密的令牌)则将其他方的claims(声明)隐藏
(4)当使用“公钥/私钥对”对令牌进行签名时,只有持有私钥的一方才是对其进行签名的一方
五、功能:
1、授权
这是使用JWT的最常见方案。一旦用户登录,每个后续请求将包括JWT,从而允许用户访问该令牌允许的路由,服务和资源。单点登录是今广泛使用JWT的一项功能,因为它的开销很小并且可以在不同的域中轻松使用。
— — — —
2、信息交换
JSON Web Token是在各方之间安全地传输信息的好方法。因为可以对JWT进行签名(例如,使用公钥/私钥对),所以可以确保发件人是本人。此外,由于签名是使用标头和有效负载计算的,因此还可以验证内容是否遭到篡改。
六、组成:
JwT分为三部分,头部(Header),声明(claims),签名(signature)
令牌组成:header.payload.signature
6.1、头部(Header)
6.1.1、介绍:
描述的是最基本的信息,通常由两部分组成:令牌的类型(即JWT)和所使用的签名算法。
并使用Base64编码组成JWT结构的第一部分
6.1.2、示例:
{“alg”:“HS256”, // 加密算法
“typ” : “JWT” // 类型
}
6.1.3、注:
//alg
指JWT签名使用的算法参数,HS256表示HMAC SHA256。常见值用s256(默认),Hs512等,也可以为None。//typ
指token的类型为JWT
6.2、Payload
6.2.1、介绍:
令牌的第二部分是有效负载(包含声明,用户信息交换), token 的一些基本信息,以帮助接受它的服务器来理解这个 token
声明是有关实体(通常是用户)和其他数据的声明
并使用Base64编码组成JWT结构的第二部分
— — — —
6.2.2、载荷示例:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
— — — —
6.2.3、声明(Claims):
{undefined
“exp”: 1416471934,//到期时间
“user_name”: “user”,
“scope”: [
“read”,
“write”
],
“authorities”: [
“ROLE_ADMIN”,
“ROLE_USER”
],
“jti”: “9bc92a44-0b1a-4c5e-be70-da52075b9a84”,//JwT ID用于标识该JwT
“client_id”: “my-client-with-secret”
}— — — —
6.2.4、参数:
JWT固定参数(但并不是必须):
iss:发行人、exp:到期时间、sub:主题
aud:用户、nbf:在此之前不可用
iat:发布时间、jti: JwT ID用于标识该JwT
6.3、签名(Signature)
6.3.1、简介:
Header.Payload.Signature(签名在最后),验证消息在整个过程中没被更改,并且对于使用私钥进行签名的令牌,它还可以验证JWT的发送者是它所说的真实身份。
创建签名,必须获取编码的头部,编码的有效载荷,密钥,头部中指定的算法,并对其进行签名
签名:服务器有一个不会发送给客户端的密码(secret),用头部中指定的算法对头部和声明的内容用此密码进行加密,生成的字符串就是 JWT 的签名。
6.3.2、示例:
HS256 生成 JWT
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
七、认证过程:
(1)用户端登录,通过前端web表单,把用户名和密码在请求中发往服务器接口,通过SSL加密的传输(https协议),从而避免敏感信息被嗅探(一般是HTTP POST)
— —
(2)(确认登录信息正确后)服务器生成json头部和声明,将登录信息写入JsoN的声明中(通常不应写入密码,因为JwT是不加密的),并用secret用指定算法进行加密,生成该用户的JwT。此时,服务器并没有保存登录状态信息。
— —
(3)服务器将JwT (通过响应)作为登录成功的结果返回给客户端,前端可以将返回的结果保存在localStorage或sessionStorage中,退出登录时前端删除保存的JWT
— —
(4)用户下次会话时(每次请求),客户端会自动将JwT写在HTTP Header的Authorization字段中
— —
(5)服务器对JwT有效性验证,若验证成功,则确认此用户的登录状态
— —
(6)使用JWT中包含的用户信息进行其他逻辑操作,并返回响应
八、利用方法:
8.1、第一步:识别JWT
使用BP代理,历史记录会保存
使用正则匹配JWT:
//网址的JWT版本
eyJ[A-Za-z0-9_-]*\.[A-Za-z0-9._-]*//所有JWT版本(误报的可能性更高)
eyJ[A-Za-z0-9_\/+-]*\.[A-Za-z0-9._\/+-]*
8.2、第二步:测试已知漏洞
用jwt_tool测试已知漏洞
测试漏洞-RSA密钥混淆(CVE-2016-5431)
测试漏洞-JWKS注入(CVE-2018-0114)
……
8.3、第三步:利用方法
(1)寻找需要JWT认证页面(人资料页……),重发JWT,分析响应变化
— —
(2)删除令牌观察结果,并检查标头、Cookie或POST数据等其他授权手段
— —
(3)删除签名的最后几个字符,检查响应成功或失败。分析详细错误信息,看是否能获取敏感内容,若删除前后返回页面相同,则不检查签名;反之不同,检测。
— —
(4)重新发送同一令牌多次,穿插不发送令牌,或者一次发送无效签名(从令牌末尾删除一个或两个字符)。
若正常,相同的JWT还未注销,或在注销后或持续很长时间后仍然有效(不朽);
反之,令牌失效,可以以编程方式调用“刷新令牌” API
— —
(5)寻找令牌在哪创建(正常情况是服务器),若是客户端,则可以访问并获取该密钥
— —
(6)使用工具The JSON Web Token Toolkit v2更改能直接在页面上呈现的任何有效载荷,同时保持签名不变。
先修改头部,再修改载荷,最后选择保持原本签名。分析页面响应,若被更改,则说明在验证以前就处理了这些操作,尝试去修改更重要的内容
8.4、第四步:GET密钥
HMAC签名密钥(例如HS256 / HS384 / HS512)使用对称加密(加解密同一秘钥)
使用工具破解
The JSON Web Token Toolkit v2
JWT cracker
(最后带GitHub地址)
九、工具:
9.1、The JSON Web Token Toolkit v2
用于测试,调整和po解JSON网络令牌的工具包
9.2、JWT cracker
用C编写的多线程JWT Brute-Force Cracker。如果您很幸运或具有巨大的计算能力,则该程序应该找到JWT令牌的秘密钥匙,使您可以伪造有效的令牌。
- 点赞
- 收藏
- 关注作者
评论(0)