JWT 渗透测试全姿势盘点:从原理到实战漏洞利用详解

导语

师傅们在渗透测试做越权时,尤其是小程序的资产会经常看到cookie的字段是以eyj开头的字符串,不乏会有些头痛,没办法修改一些敏感字段从而达到越权。这就是jwt(JSON Web Token)。下面我会对jwt的渗透姿势有一个详细的讲解。

原理

简单来说jwt就是一个身份认证的字符串,有三部分组成:第一部分是头部(Header),第二部分是载荷(Payload),第三部分是签名(Signature)。每个部分有.分割并且通过base64编码。对于我们来说其实只需要关注前两个部分。下面我会分别解释这两个部分。
image.png

Header

Header部分的功能简单来说就是定义了这个jwt的加密算法和识别签名的密钥。这两个功能分别对应Header部分的alg,kid这两个参数。
image.png

Payload

Payload部分其实也就是这个字符串的核心包含身份认证的字段。下图的用户字段是sub实战情况下uid、userid这些也都可能。
image.png
那就想问了那我在这里直接改不就好了,这个话说的对,也不对。这个要说一下jwt的工作原理:我们上面的Header和Payload部分在进行base64编码还会通过算法密钥进行加密,如果更改这两部分的一些参数会导致整个字符串更改。从而无法进行过越权。这个也是是否产生漏洞的核心
image

姿势

有缺陷的jwt校验

原理:JWT库有两个处理令牌的方法,在Node.js中,有verify()和decode()方法,分别进行验证令牌和解码令牌的操作。那么开发者在对令牌校验是使用的是decode(),说明就没有对签名进行检测。就存在安全问题。这也是上面说对也不对的原因。

verify() 方法:用于验证令牌的签名是否有效,同时解码令牌内容。如果签名无效,该方法会抛出错误。
decode() 方法:仅用于解码令牌内容,不解密或验证签名。

image
案例主要来自bp靶场还有一个实际案例。下面可是我们第一个实验。登录后生成jwt。
image.png
放到jwt解析网站,更改其sub字段为administrator。(网站:https://www.jsongj.com/ede/jwt)
image.png
我们可以看到这里的签名是随机的,按照jwt的工作原理这个是不行的。但是这个是存在漏洞的。然后我们拿着这个jwt访问管理员路径。
image.png

空密码算法

原理:开发者没有对jwt的算法类型严格校验,就存在安全问题。我们上面说过alg参数是决定jwt算法的类型,那么是空算法会导致密钥也不会生效。从而达到越权。
image
依旧是bp靶场登录生成jwt,放到jwt解析网站,更改其sub字段为administrator,并且把alg字段设置为none。
image.png
然后我们拿着这个jwt访问管理员路径。
image.png

密钥可爆破

原理:常见的jwt加密算法有两种HS256(对称加密),RS256(非对称加密)。那么对称加密也就是只存在一个密钥对字符串加解密。如果开发者使用了存在弱口令的密钥,就存在安全问题了。
image
这里使用实际案例分享,找到一处登录框注册登录。
image.png
image.png
查看cookie为jwt并且加密算法为hs256,尝试使用hashcat爆破密钥

命令:hashcat -m 16500 -a 0 jwt.txt jwt.secrets.list –force
字典:https://github.com/wallarm/jwt-secrets/blob/master/jwt.secrets.list

image.png
修改参数为admin,成功登录后台
image.png

jwk注入

原理:当jwt使用非对称算法时公钥会可能写在jwt内部,如果开发者没有严格遵守公钥白名单,可能导致任意密钥进行验证,就存在安全问题了。
image
依旧是bp靶场登录生成jwt,复制jwt使用jwt_tools实现jwk注入攻击。(具体一下参数请看工具使用)

命令:python jwt_tool.py jwt -I -pc sub -pv administrator -hc kid -hv jwt_tool -X i
下载地址:https://github.com/ticarpi/jwt_tool

image.png
然后我们拿着这个jwt访问管理员路径。
image.png

jku注入

原理:上面说过如果使用非对称加密算法公钥可能写在jwt里,同时也可能写在一个web路径。还是如果开发者没有严格遵守公钥白名单,可能导致任意密钥进行验证。相对与jwk注入是本地加载,而jku是远程加载。
image
依旧是bp靶场登录生成jwt,复制jwt使用jwt_tools实现jku注入攻击。靶场为我们提供了公钥的加载路径url。

命令:python jwt_tool.py jwt -I -pc sub -pv administrator -hc kid -hv jwt_tool -X s -ju url

image.png
然后我们把生成的公钥写到公钥加载的url中
image.png
image.png
然后我们拿着这个jwt访问管理员路径。
image.png

算法混淆

原理:服务器预期用 RS256(非对称)验证,但攻击者将 alg 改为 HS256(对称),并利用服务器公开的 RSA 公钥作为 HS256 的 “共享密钥” 生成签名。
image
bp靶场指明了公钥的路径。把公钥转换成pem格式。保存到电脑命名为key.pem(网站:https://www.authgear.com/tools/jwk-generator)
image.png
image.png
依旧是bp靶场登录生成jwt,复制jwt使用jwt_tools实现算法混淆攻击。

命令:python jwt_tool.py jwt -X k -pk key.pem -I -pc sub -pv administrator
image.png

然后我们拿着这个jwt访问管理员路径。
image.png
针对jwt以上的姿势应该适用于大部分场景,还有一些kid参数sql注入,目录遍历漏洞。因为没有实际案例,就没有说。等实战测试记得测一下就好了

结语

总结一下吧,先看加密算法,如果是对称加密,就尝试爆破密钥,或设置none算法,非对称算法尝试是否存在jkw,jku。或sql注入或目录遍历。
© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容