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

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

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

Payload
Payload部分其实也就是这个字符串的核心包含身份认证的字段。下图的用户字段是sub实战情况下uid、userid这些也都可能。

那就想问了那我在这里直接改不就好了,这个话说的对,也不对。这个要说一下jwt的工作原理:我们上面的Header和Payload部分在进行base64编码还会通过算法密钥进行加密,如果更改这两部分的一些参数会导致整个字符串更改。从而无法进行过越权。这个也是是否产生漏洞的核心

姿势
有缺陷的jwt校验
原理:JWT库有两个处理令牌的方法,在Node.js中,有verify()和decode()方法,分别进行验证令牌和解码令牌的操作。那么开发者在对令牌校验是使用的是decode(),说明就没有对签名进行检测。就存在安全问题。这也是上面说对也不对的原因。
verify() 方法:用于验证令牌的签名是否有效,同时解码令牌内容。如果签名无效,该方法会抛出错误。
decode() 方法:仅用于解码令牌内容,不解密或验证签名。

案例主要来自bp靶场还有一个实际案例。下面可是我们第一个实验。登录后生成jwt。

放到jwt解析网站,更改其sub字段为administrator。(网站:https://www.jsongj.com/ede/jwt)

我们可以看到这里的签名是随机的,按照jwt的工作原理这个是不行的。但是这个是存在漏洞的。然后我们拿着这个jwt访问管理员路径。

空密码算法
原理:开发者没有对jwt的算法类型严格校验,就存在安全问题。我们上面说过alg参数是决定jwt算法的类型,那么是空算法会导致密钥也不会生效。从而达到越权。

依旧是bp靶场登录生成jwt,放到jwt解析网站,更改其sub字段为administrator,并且把alg字段设置为none。

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

密钥可爆破
原理:常见的jwt加密算法有两种HS256(对称加密),RS256(非对称加密)。那么对称加密也就是只存在一个密钥对字符串加解密。如果开发者使用了存在弱口令的密钥,就存在安全问题了。

这里使用实际案例分享,找到一处登录框注册登录。


查看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

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

jwk注入
原理:当jwt使用非对称算法时公钥会可能写在jwt内部,如果开发者没有严格遵守公钥白名单,可能导致任意密钥进行验证,就存在安全问题了。

依旧是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

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

jku注入
原理:上面说过如果使用非对称加密算法公钥可能写在jwt里,同时也可能写在一个web路径。还是如果开发者没有严格遵守公钥白名单,可能导致任意密钥进行验证。相对与jwk注入是本地加载,而jku是远程加载。

依旧是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

然后我们把生成的公钥写到公钥加载的url中


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

算法混淆
原理:服务器预期用 RS256(非对称)验证,但攻击者将 alg 改为 HS256(对称),并利用服务器公开的 RSA 公钥作为 HS256 的 “共享密钥” 生成签名。

bp靶场指明了公钥的路径。把公钥转换成pem格式。保存到电脑命名为key.pem(网站:https://www.authgear.com/tools/jwk-generator)


依旧是bp靶场登录生成jwt,复制jwt使用jwt_tools实现算法混淆攻击。
命令:python jwt_tool.py jwt -X k -pk key.pem -I -pc sub -pv administrator
然后我们拿着这个jwt访问管理员路径。

针对jwt以上的姿势应该适用于大部分场景,还有一些kid参数sql注入,目录遍历漏洞。因为没有实际案例,就没有说。等实战测试记得测一下就好了
结语
总结一下吧,先看加密算法,如果是对称加密,就尝试爆破密钥,或设置none算法,非对称算法尝试是否存在jkw,jku。或sql注入或目录遍历。
github:hkl1x
weixin:wxid_gyhkcfxipu5w22
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
已在FreeBuf发表 0 篇文章
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf
客服小蜜蜂(微信:freebee1024)




