xcbh1282024-03-15文章来源:SecHub网络安全社区
JSON Web Token(JSON Web令牌)是一种跨域验证身份的方案。JWT不加密传输的数据,但能够通过数字签名来验证数据未被算改常用于分布式站点的单点登录。JWT的声明一般被用在客户端与服务端之间传递身份认证信息,便于向服务端请求资源。
1、用户端登录,用户名和密码在请求中被发往服务器。
2、(确认登录信息正确后)服务器生成JSON头部和声明,将登录信息写入JSON的声明中(通常不应写入密码,因为JWT是不加密的),并用secret用指定算法进行加密,生成该用户的JWT。此时,服务器并没有保存登录状态信息。
3、服务器将JWT(通过响应)返回给客户端。
4、用户下次会话时,客户端会自动将JWT写在中HTTP请求头部的Authorization字
段中。
5、服务器对JWT进行验证,若验证成功,则确认此用户的登录状态。
6、服务器返回响应。
JWT分为三部分:头部(Header)、声明(Claims)、签名(Signature),三个部分以英文句号隔开。JWT内容以Base64URL进行了编码。
使用webgoat
https://github.com/WebGoat/WebGoat/releases/tag/v8.2.2
需要JDK高版本,这里用JDK17
输入命令 java -jar webgoat-server-8.8.8.jar启动
访问127.0.0.1:8080/WebGoat
找到靶场
尝试更改您收到的令牌并通过更改令牌成为管理员用户,一旦您成为管理员,就会重置投票
可以看到我们现在的用户是tom用户
点击重置并抓包
数据包中使用JWT作身份验证
抓取返回包提示只有管理员才有重置权限
将那段Cookie中的JWT字段解密一下这里使用Burp商店自带的JWT解密
将false改为true发包测试
提示签名不对
将签名算法HS512改为none
因为签名算法为空,所以JWT第三部分签名部分直接去掉
放包
成功重置。
JWT密钥爆破攻击
将该JWT数据解密
https://jwt.io/ 在线转化网址
将username改为WebGoat 将exp字段改大
爆破密钥
用hashcat爆破
https://github.com/hashcat/hashcat
hashcat -m 16500 jwt.txt -a 3 dict.txt
爆破出密钥之后,替换密钥生成新JWT
通过修改令牌让tom进行付款
点击checkout抓包
看到Authorization字段为空
查看日志
里面出现JWT字段
解密
修改字段
成功让tom购买
JWT不仅可以验证身份还可以传输数据,因此JWT还可以结合SQL注入进行攻击
让Jerry越权删除Tom
点击删除抓包
复制JWT查看内容
通过查询源码可以看到查询sql语句
构造sql注入语句
hacked' UNION select 'delete' from INFORMATION_SCHEMA.SYSTEM_USERS --
同时通过源码,可以看到密钥在用于检查 JWT 声明之前已进行 base64 解码,因此我们反推,在数据库中存储的是经过base64编码的。
对delete进行base64编码后,新sql语句为
hacked' UNION select 'ZGVsZXRl' from INFORMATION_SCHEMA.SYSTEM_USERS --
修改JWT内容
eyJ0eXAiOiJKV1QiLCJraWQiOiJoYWNrZWQnIFVOSU9OIHNlbGVjdCAnWkdWc1pYUmwnIGZyb20gSU5GT1JNQVRJT05fU0NIRU1BLlNZU1RFTV9VU0VSUyAtLSIsImFsZyI6IkhTMjU2In0.eyJpc3MiOiJXZWJHb2F0IFRva2VuIEJ1aWxkZXIiLCJpYXQiOjE1MjQyMTA5MDQsImV4cCI6MTY5ODkwNTMwNCwiYXVkIjoid2ViZ29hdC5vcmciLCJzdWIiOiJUb21Ad2ViZ29hdC5jb20iLCJ1c2VybmFtZSI6IlRvbSIsIkVtYWlsIjoiVG9tQHdlYmdvYXQuY29tIiwiUm9sZSI6WyJDYXQiXX0.CA6yHxOh0CtFrM1w5-nENuaqSeqnOR_muaJi-bFbbrI
替换发包
成功删除tom