干货JWT渗透姿势一篇通

开通VIP,畅享免费电子书等14项超值服

首页

好书

留言交流

下载APP

联系客服

2023.10.29广东

星标不再迷路,谢谢大家!

JWT(JSONWebToken)的结构由三部分组成,分别是Header、Payload和Signature,下面是每一部分的详细介绍和示例:

Header包含了JWT使用的算法和类型等元数据信息,通常使用JSON对象表示并使用Base64编码,Header中包含两个字段:alg和typalg(algorithm):指定了使用的加密算法,常见的有HMAC、RSA和ECDSA等算法typ(type):指定了JWT的类型,通常为JWT

下面是一个示例Header:

其中alg指定了使用HMAC-SHA256算法进行签名,typ指定了JWT的类型为JWT

下面是一个示例Payload:

Signature是使用指定算法对Header和Payload进行签名生成的,用于验证JWT的完整性和真实性,Signature的生成方式通常是将Header和Payload连接起来然后使用指定算法对其进行签名,最终将签名结果与Header和Payload一起组成JWT,Signature的生成和验证需要使用相同的密钥,下面是一个示例Signature

其中HMACSHA256是使用HMACSHA256算法进行签名,header和payload是经过Base64编码的Header和Payload,secret是用于签名和验证的密钥,最终将Header、Payload和Signature连接起来用句点(.)分隔就形成了一个完整的JWT,下面是一个示例JWT,其中第一部分是Header,第二部分是Payload,第三部分是Signature,注意JWT中的每一部分都是经过Base64编码的,但并不是加密的,因此JWT中的信息是可以被解密的

JWT的工作流程如下:

Step1:用户携带JWS(带有签名的JWT)访问应用

Step2:应用程序解码JWS得到JKU字段

Step3:应用根据JKU访问返回JWK的服务器

Step4:应用程序得到JWK

Step5:使用JWK验证用户JWS

Step6:验证通过则正常响应

JWT(JSONWebToken)的签名验证过程主要包括以下几个步骤:

下面是一个使用JAVA进行JWT签名验证的示例代码:

在上面的示例代码中使用jwt库进行JWT的签名和验证,首先构建了一个JWT,然后将其分离为Header、Payload和Signature三部分,使用parseClaimsJws函数对JWT进行解析和验证,从而获取其中的Payload中的信息并进行验证,最后如果解析和验证成功,则说明JWT是有效的,否则说明JWT是无效的,在实际应用中应该将SECRET_KEY替换为应用程序的密钥

Step3:此时在我们的burpsuite中我们可以看到如下的会话信息

此时查询当前用户可以看到会显示当前用户为wiener:

截取上面中间一部分base64编码的部分更改上面的sub为'administrator'

构造一个sub为'administrator'的载荷并将其进行base64编码处理:

替换之后重新发送请求:

按照题目要求访问/admin路径,发现两个删除用户的调用接口:

请求敏感链接——删除用户carlos

完成靶场的解答:

在JWT的Header中alg的值用于告诉服务器使用哪种算法对令牌进行签名,从而告诉服务器在验证签名时需要使用哪种算法,目前可以选择HS256,即HMAC和SHA256,JWT同时也支持将算法设定为'None',如果'alg'字段设为'None',则标识不签名,这样一来任何token都是有效的,设定该功能的最初目的是为了方便调试,但是若不在生产环境中关闭该功能,攻击者可以通过将alg字段设置为'None'来伪造他们想要的任何token,接着便可以使用伪造的token冒充任意用户登陆网站

Step4:捕获到的数据报信息如下所示

截取JWT的第二部分对其进行base64解码:

将上述的sub字段值更改为'administrator'

Step4:在使用wiener用户的凭据访问/admin是会提示401Unauthorized

Step5:将第一步分的alg参数改为none

更改之后的header部分:

替换JWTToken中的第二部分为之前我们构造的信息,同时移除签名部分,再次请求数据获取到敏感数据链接

调用敏感链接移除用户信息,完成解题操作:

在JT中密钥用于生成和验证签名,因此密钥的安全性对JWT的安全性至关重要,一般来说JWT有以下两种类型的密钥:

下面是一个使用JWT和对称密钥的JAVA示例代码:

在这里我们也建议使用hashcat来强力破解密钥,您可以手动安装hashcat,也可以在KaliLinux上使用预先安装好的hashcat,您只需要一个来自目标服务器的有效的、签名的JWT和一个众所周知的秘密的单词表然后就可以运行以下命令,将JWT和单词列表作为参数传入:

hashcat-a0-m16500Hashcat会使用单词列表中的每个密钥对来自JWT的报头和有效载荷进行签名,然后将结果签名与来自服务器的原始签名进行比较,如果有任何签名匹配,hashcat将按照以下格式输出识别出的秘密以及其他各种详细信息,由于hashcat在本地机器上运行不依赖于向服务器发送请求,所以这个过程非常快,即使使用一个巨大的单词表一旦您确定了密钥,您就可以使用它为任何JWT报头和有效载荷生成有效的签名

实验步骤:Step1:点击上述'Accessthelab'进入到靶场环境

Step3:捕获到如下有效的JWT凭据信息

Step5:使用字典进行暴力猜解操作

Step1:克隆项目到本地

Step2:安装依赖库

pip3installpycryptodomexStep3:运行jwt_tool并查看用法信息

附加扩展:

payload(前):

payload(新):

Signer:

最终高权限的JWTtoken如下:

Step6:访问/admin路径

Step7:调用接口删除用户完成解答

如果服务器端使用一个非常脆弱的密钥,我们甚至有可能一个字符一个字符地来暴力破解这个密钥,根据JWS规范只有alg报头参数是强制的,然而在实践中JWT报头通常包含几个其他参数,以下是攻击者特别感兴趣的:

这些用户可控制的参数每个都告诉接收方服务器在验证签名时应该使用哪个密钥,下面我们将介绍如何利用这些参数来注入使用您自己的任意密钥而不是服务器的密钥签名修改过的JWT

下面我们介绍如何通过JWK参数注入自签名的JWT,JWS(JSONWebSignature)规范描述了一个可选的jwkheader参数,服务器可以使用该参数以jwk格式将其公钥直接嵌入令牌本身,您可以在下面的JWThead中看到具体的示例:

Step1:点击'ACCESSTHELAB'访问靶场

Step5:下面我们开始操作,不过在此之前我们得先武器化以下自己,在Burpsuite界面选择'Extender'选项卡,紧接着点击'BAppStore'安装'JWTEditor'

之后你可以看到如下的选项卡界面

Step6:生成一个新的RSA密钥

Step7:刷新页面拦截到请求并将请求发送到Repeat模块

Step8:在Repeat模块,我们切换到JSONWebToken选项卡,修改JWT的有效负载将sub内容修改为administrator

Step9:点击'Attack',然后选择'EmbeddedJWK',出现提示时选择您新生成的RSA密钥

Step10:之后成功越权

Step11:调用敏感操作接口删除carlos用户完成解题

Step1:首先点击上方的'ACCESSTHELAB'选项卡进入实验环境

Step4:使用burpsuite生成一个新的RSA密钥

Step5:发送请求到repeat

Step6:复制公钥作为JWK

Step7:在题目中选择'Goeoexploitserver',然后加上key头并保存到exploit的body中

Step8:然后切换至repeat的'JSONWebToken'界面,将kid修改成自己生成的JWK中的kid值,将jku的值改为exploit

Step9:切换sub为administrator

Step10:点击下面的sign,选择Don’tmodifyheader模式

Step11:更改请求路径发送请求成功越权

Step12:请求敏感路径删除carlos用户

Step13:成功解题

服务器可能使用几个密钥来签署不同种类的数据,因此JWT的报头可能包含kid(密钥id)参数,这有助于服务器在验证签名时确定使用哪个密钥,验证密钥通常存储为一个JWK集,在这种情况下服务器可以简单地查找与令牌具有相同kid的JWK,然而JWS规范没有为这个ID定义具体的结构——它只是开发人员选择的任意字符串,例如:它们可能使用kid参数指向数据库中的特定条目,甚至是文件的名称,如果这个参数也容易受到目录遍历的攻击,攻击者可能会迫使服务器使用其文件系统中的任意文件作为验证密钥,例如:

Step1:点击上方'AccessTheLab'进入靶场

Step4:使用burpsuite的插件生成一个对称密钥(SymmetricKey)并将k的值修改为'AA=='即为null

Step5:拦截一个请求将其发送到repeat模块

Step6:此时直接访问/admin——提示'401Unauthorized'

Step7:在JSONWebToken界面中修改kid值和sub进行目录遍历,这里的'/dev/null'文件名与'AA=='一致都为null,对称密钥,所以可以成功绕过

Step8:点击sign选择OCT8的密钥攻击

Step9:成功越权

Step10:调用敏感接口删除carlos用户完成解题

算法混淆攻击(也称为密钥混淆攻击)是指攻击者能够迫使服务器使用不同于网站开发人员预期的算法来验证JSONweb令牌(JWT)的签名,这种情况如果处理不当,攻击者可能会伪造包含任意值的有效jwt而无需知道服务器的秘密签名密钥JWT可以使用一系列不同的算法进行签名,其中一些,例如:HS256(HMAC+SHA-256)使用'对称'密钥,这意味着服务器使用单个密钥对令牌进行签名和验证,显然这需要像密码一样保密

使用这种方法的网站开发人员认为它将专门处理使用RS256这样的非对称算法签名的JWT时,问题就出现了,由于这个有缺陷的假设他们可能总是传递一个固定的公钥给方法,如下所示:

publicKey=;token=request.getCookie('session');verify(token,publicKey);在这种情况下如果服务器接收到使用对称算法(例如:HS256)签名的令牌,库通用verify()方法会将公钥视为HMAC密钥,这意味着攻击者可以使用HS256和公钥对令牌进行签名,而服务器将使用相同的公钥来验证签名(备注:用于签署令牌的公钥必须与存储在服务器上的公钥完全相同,这包括使用相同的格式(如X.509PEM)并保留任何非打印字符,例如:换行符,在实践中您可能需要尝试不同的格式才能使这种攻击奏效)攻击流程简易视图如下:

Step1:点击'Accessthelab'访问靶场

Step4:服务器有时通过映射到/jwks.json或/.well-known/jwks.json的端点将它们的公钥公开为JSONWebKey(JWK)对象,比如大家熟知的/jwks.json,这些可能被存储在一个称为密钥的jwk数组中,这就是众所周知的JWK集合,即使密钥没有公开,您也可以从一对现有的jwt中提取它

Step5:在Burpsuite的JWTEditorKeys中点击'NewRSAKey',用之前泄露的JWK而生成一个新的RSAKey

Step6:选中'CopyPublicKeyasPEM',同时将其进行base64编码操作,保存一下得到的字符串(备注:上下的一串-----ENDPUBLICKEY-----不要删掉)

base64后结果:

Step7:在JWTEditorKeys处,生成新的对称加密Key,用之前保存的base64编码去替换k的值

Step8:捕获请求数据报并将其发送到repeat模块

此时直接请求/admin是无法请求到的

Step9:随后修改alg为HS256,修改sub为administrator并进行Sign操作

Step10:重新发送数据包可以看到回显成功

Step11:请求敏感连接删除用户完成解题

随后将其放到Port提供的docker工具里面运行,运行的命令如下

jwt_forgery.py脚本会输出一系列token的存在情况值

Step2:这里我们尝试每一个TemperedJWT,Port这里给了提示说是X.509形式的,所以我们只需要将X.509形式的JWT进行验证即可,当Response回应200时代表token是有效的,若为302则代表了重定向,下图是一个成功的案例

Step3:将JWT的Base64编码拿过来先放到记事本里面暂存,在Burpsuite的JWTEditorKeys点击NewSymmetricKey,将上面的Base64编码拿过来替换此对称密钥的k值,生成对称密钥之后进行和之前攻击一致的Sign操作

靶场JWT信息如上所示,而在实战中我们可以去抓包,如果抓到的数据包中有类似这样的JWT认证那我们就可以直接拿去解密了,我们拿到的数据是这样的:

在这里我们可以看到payload部分的数据解密出来后包含password字段信息,后面解出来的是一串MD5数据,之后我们将其拿到MD5在线解密网站进行解密操作:

JWT中的密钥是用于对令牌进行签名或加密的关键信息,在实现JWT时密钥通常存储在应用程序代码中即所谓的'硬编码',这种做法可能会导致以下安全问题:

JWT密钥硬编码:

JWTToken有效期为1小时

但是在过期后发现使用之前过期的JWTToken可以继续进行会话操作

测试效果如下:

用于利用CRLF漏洞的脚本

欢迎加入星球!

代码审计+免杀+渗透学习资源+各种资料文档+各种工具+付费会员

THE END
1.解方程也没有那么难解方程也没有那么难言西早老师 湖南 0 打开网易新闻 体验效果更佳闺女惹妈妈生气,竟找最菜的当靠山,也不知道哪来的勇气 三川搞笑 479跟贴 打开APP 儿子啊!我今天才发现,你真是个人才 盐城一家人啊 139跟贴 打开APP 《吾辈楷模名场面》男人一定不能美色引导自己 追综搞笑配音 3942跟贴 打开APP 盘点那些脾气https://m.163.com/v/video/VHICMSJO3.html
2.音视频之音频知识入门将新编码器与基于过时技术甚至是带有缺陷的旧编码器比较可能会产生对于旧格式不利的结果。由于有损编码会丢失信息这样一个现实,MP3算法通过创建人类听觉总体特征的模型尽量保证丢弃的部分不被人耳识别出来(例如,由于noise masking),不同的编码器能够在不同程度上实现这一点。https://developer.aliyun.com/article/1202302
3.运动学与动力学约束下的在线机器人时间最优轨迹规划算法(ToppTOPP-RA算法如下图所示,这里我们回到之前提到的后向传播和前向传播(这两个传播过程就是文章标题的Reachability Analysis),后向传播搜索出上界(N个)和下界(N个),每个搜索步骤都是上面提到的小的LP问题,这样,后向传播一共需求解2N个LP问题;同样的,前向传播每次求解也是一个小的LP问题;所以,整个LP问题需要求解3N个https://blog.csdn.net/fqianqian96/article/details/137047123
4.机器人编程试题及答案(精选7篇)Lnode {ElemType data;struct Lnode *next;}Lnode, *LinkList;算法如下: void Delete_all_x(LinkList L, Elemtype x){ Lnode *p, *q;p=L;while(p){ if(p->next && p->next->data==x){q=p->next;p->next=q->next;delete q;} else p=p->next;} } 注意:要删除所有的值为x的结点。6https://www.360wenmi.com/f/filefafwyst5.html
5.JavaScript排序算法动画演示效果的实现方法javascript技巧下面小编就为大家带来一篇JavaScript排序算法动画演示效果的实现方法。小编觉得挺不错的,现在就分享给大家var len = arr.length,leftArr=[],rightArr=[],tag,i,j,k,temp,len_l,len_r,lb,ra; ifhttps://www.jb51.net/article/94968.htm
6.如何快速掌握组合数公式?,教育,k12教育,好看视频如何快速掌握组合数公式? 百度文库 53万粉丝 · 77万个视频百度文库官方账号 关注 接下来播放自动播放 09:37 台湾终于开放了,跟我走进金门看看台湾人民的生活过的怎么样 福建小林 184万次播放 · 3.0万次点赞 03:48 暗区突围:超强短突ARX160拿下6人,垂直突破100超逆天 子薇游戏日常 5.4万次播放 · 4384次点https://haokan.baidu.com/v?pd=wisenatural&vid=12586187067867843137
7.首个免费国密证书签发平台上线● CA/RA测试接口 ● 用户登录后可保存和检索历史记录 ● 提供国密SSL连接测试 ● 提供自建CA技术支持 ● 目前GMCert 已经正式上线提供服务,最常用的各类算法证书签发等功能均已发布。后续更多内容如:用户登录注册、自定义CA、我的证书等高级功能会陆续上线,敬请期待。 GMCerthttps://www.meipian.cn/2f9erjje
8.启发式图搜索算法RA~*的改进算法IRA~*及IRA′(如何获取全文?欢迎:购买知网充值卡、在线充值、在线咨询) CAJViewer阅读器支持CAJ、PDF文件格式,AdobeReader仅支持PDF格式 【相似文献】 中国期刊全文数据库前30条 1王士同启发式图搜索算法RA~*的改进算法IRA~*及IRA′[J];计算机学报;1991年03期 2向阳;陈爱萍;李海霞;成玉斌;方永光;低增生性骨髓增生异常综合征https://www.cnki.com.cn/Article/CJFDTotal-JSJX199103005.htm
9.nginx性能优化防盗链会话劫持等51CTO博客–with-http_gzip_static_module //在线实时压缩输出数据流 –with-http_image_filter_module //传输JPEG/GIF/PNG 图片的一个过滤器)(默认为不启用。gd库要用 到) –with-http_spdy_module //SPDY可以缩短网页的加载时间 –with-http_sub_module //允许用一些其他文本替换nginx响应中的一些文本 https://blog.51cto.com/u_14173127/2471416
10.动画演示算法,animationsdemoalgorithm,音标,读音,翻译,英文动画演示算法例句>> 2) animation demonstration 动画演示 1. Research on Animation Demonstration and Algorithm Teaching 动画演示与算法教学研究 2. This article introduces the way and process of computer aided conception design,3D modeling,full-scale draft making and animation demonstration design in bushttp://www.dictall.com/indu61/12/6112939533E.htm
11.银符考试题库在线练习47. 长期工作或停留的房间场所,照明光源的显色指数Ra不宜小于 。 A.50 B.60 C.70 D.80 A B57. 负荷计算中需要系数法算法的基础是 。 A.概率论 B.需要系数 C.负荷曲线 D.数理统计 A B Chttp://www.cquc.net:8089/YFB12/examTab_getExam.action?su_Id=7&ex_Id=9050
12.tfra中的两种embedding稀疏参数的使用方法tfra.dynamic_embedding(DynamicEmbedding组件) tfra.dynamic_embedding组件基于腾讯微信看一看团队戎海栋、张亚霏、程川等人 2020 年提出的稀疏域隔离方案 109实现,其设计目标如下: 使TensorFlow 可以训练 Keys-Values 数据结构(Hash Table) 与TensorFlow 原有功能有更好的兼容性,不改变算法工程师建模习惯 https://www.deeplearn.me/4310.html
13.CTF在线工具在线栅栏密码加密、在线栅栏密码解密、栅栏密码原理、栅栏密码算法、Railfence Cipher。http://www.hiencode.com/railfence.html
14.数据结构与算法(C#实现).pdf数据结构与算法(C#实现).pdf 67页VIP内容提供方:zsmfjy 大小:3.69 MB 字数:约5.59万字 发布时间:2022-09-10发布于河北 浏览人气:273 下载次数:仅上传者可见 收藏次数:0 需要金币:*** 金币 (10金币=人民币1元)数据结构与算法(C#实现).pdf 关闭预览 想预览更多内容,点击免费在线预览全文 免费https://max.book118.com/html/2022/0905/6003044042004233.shtm
15.门窗生产软件推荐零代码企业数字化知识站Ra Workshop的软件内置了强大的算法优化和自动排版功能,用户可以利用这些功能进行材料和生产工艺的优化。系统能够自动计算材料使用量和排版方案,大大提升了材料利用率和生产效率,减少了浪费。这对于成本控制和资源优化具有极大的帮助。 高级设计模块 Ra Workshop提供了高级设计模块,允许用户进行高度定制化的设计。这些模块支https://www.jiandaoyun.com/blog/article/308286/