[学习JWT安全]JWT安全的学习笔记

学习了JWT(json web token),下边是笔记👇


0x01 原理

先挂一个加解密jwt的站: https://www.bejson.com/jwt/
JWT就是经过对称加密后的json ,密文前两个部分一般以 ”eyJ” 开头.整体分为首部(header) 载荷(payload) 密钥(key)如图

Header的键alg的值为加密算法,挖洞打靶时可以把它改成none试试,有时候改成了none然后删掉jwt的第三部分,运气好后端就不校验了.
签名算法: 有对称密钥与非对称公私密钥 对称密钥如HS512 可以尝试爆破
编码算法: 这里的密钥只用作校验,前两部分编码和解码不需要密钥,编码和解码的算法为base64
为什么以eyJ开头: 观察头部首部可以发现jwt的载荷字符串都是以 {“ 开头的,而 {" 的base64编码为eyJ= (说不定开发者也可能以{‘ 开头作jwt,这样jwt的开头标志就变成了eyd )
利用方法: 1.通过修改jwt越权 2.修改jwt实现sql注入 3.别的我还不知道
burp有一个jwt editor(快捷修改jwt) 插件 在extensions的 bapp store可以找到


0x02打靶

这里以https://portswigger.net/web-security/all-labs#jwt为例


Lab: JWT authentication bypass via flawed signature verification
实验室:通过有缺陷的签名验证绕过 JWT 身份验证
这个就是删掉jwt第三部分绕过校验
用靶场介绍页面给的账号密码登进去


如此这般抓到了cookie:jwt的包
解码这个jwt得到payload和header

{
    "kid": "af6042f2-3b38-4a84-9a4f-1842ab4748f5",
    "alg": "none" #改成none
}
{
    "iss": "portswigger",
    "exp": 1718103870,
    "sub": "admin" #把这个改成admin
}

把sub改成administrator,alg改成none,然后编码回去,并删掉key部分成功越权

posted @ 2024-06-11 18:30  sesmof  阅读(11)  评论(0编辑  收藏  举报