burpsuite攻防实验室-JWT漏洞
JWT authentication bypass via unverified signature(通过未验证签名绕过 JWT 身份验证)
本练习使用基于 JWT 的机制来处理会话。由于实现缺陷,服务器不会验证它收到的任何 JWT 的签名。
要解决该实验室问题,请修改您的会话令牌以访问 的管理面板 ,然后删除用户。/admincarlos
您可以使用以下凭据登录自己的帐户:wiener:peter
- 在实验环境中,登录你自己的账号。
- 在 Burp(抓包工具)中,进入 “代理(Proxy)”>“HTTP 历史记录(HTTP history)” 标签页,找到登录后的请求。观察到你的会话 Cookie 是一个 JWT(JSON Web Token),对应的请求为 “GET /my-account”。
- 双击该令牌的载荷(payload)部分,在 “检查器(Inspector)” 面板中查看其解码后的 JSON 格式。
注意到 “sub” 声明(claim)中包含你的用户名。将此请求发送到 “Burp 中继器(Burp Repeater)”。
- 在 Burp 中继器中,将请求路径修改为 “/admin” 并发送请求。观察到只有以 “administrator”(管理员)用户身份登录时,才能访问管理员面板
- 再次选中 JWT 的载荷部分。在检查器面板中,将 “sub” 声明的值从 “wiener”(普通用户名,示例)修改为 “administrator”,然后点击 “应用更改(Apply changes)”。
- 再次发送请求。观察到你已成功访问管理员面板
- 在响应内容中,找到用于删除 “carlos”(目标用户)的 URL(地址),该 URL 为 “/admin/delete?username=carlos”。
向此端点(endpoint)发送请求,即可完成该实验。
JWT authentication bypass via flawed signature verification
(通过存在缺陷的签名验证绕过JWT身份验证 )
- 在实验环境中,登录你自己的账号。
- 在 Burp(抓包工具)中,进入 “代理(Proxy)”>“HTTP 历史记录(HTTP history)” 标签页,找到登录后的 “GET /my-account” 请求。观察到你的会话 Cookie 是一个 JWT(JSON Web Token)。
- 双击该令牌的载荷(payload)部分,在 “检查器(Inspector)” 面板中查看其解码后的 JSON 格式。注意到 “sub” 声明(claim)中包含你的用户名。将此请求发送到 “Burp 中继器(Burp Repeater)”
- 在 Burp 中继器中,将请求路径修改为 “/admin” 并发送请求。观察到只有以 “administrator”(管理员)用户身份登录时,才能访问管理员面板。
- 再次选中 JWT 的载荷部分。在检查器面板中,将 “sub” 声明的值修改为 “administrator”,然后点击 “应用更改(Apply changes)”。
- 选中 JWT 的头部(header)部分,接着通过检查器将 “alg” 参数(算法参数)的值修改为 “none”,点击 “应用更改(Apply changes)”。
- 在消息编辑器(message editor)中,删除 JWT 中的签名(signature)部分,但需注意保留载荷后面的末尾点号(.)。
- 发送请求,观察到你已成功访问管理员面板。
- 在响应内容中,找到用于删除 “carlos”(目标用户)的 URL(地址),该 URL 为 “/admin/delete?username=carlos”。向此端点(endpoint)发送请求,即可完成该实验。
JWT authentication bypass via weak signing key
(通过弱签名密钥绕过 JWT 身份验证)
第 1 部分 - 暴力破解密钥
- 在 Burp 中,从 BApp 商店加载 JWT 编辑器扩展(JWT Editor extension)。
- 在实验环境中,登录你自己的账号,并将登录后的 “GET /my-account” 请求发送到 Burp 中继器(Burp Repeater)。
- 在 Burp 中继器中,将请求路径修改为 “/admin” 并发送请求。观察到只有以 “administrator”(管理员)用户身份登录时,才能访问管理员面板。
- 复制该 JWT(JSON Web Token)并对其密钥进行暴力破解。你可以使用 hashcat 工具,通过以下命令实现:
hashcat -a 0 -m 16500 <你的JWT令牌> /密钥字典文件路径/jwt.secrets.list
若使用 hashcat,命令执行后会输出 JWT 令牌,其后紧跟对应的密钥。若操作无误,结果会显示该弱密钥为 “secret1”。
注意:若多次运行此命令,需添加 “--show” 参数,才能再次在控制台输出结果。
第 2 部分 - 生成伪造的签名密钥
- 使用 Burp 解码器(Burp Decoder),对前一部分中暴力破解得到的密钥进行 Base64 编码。
- 在 Burp 中,进入 “JWT 编辑器密钥”(JWT Editor Keys)标签页,点击 “新建对称密钥”(New Symmetric Key)。
- 在弹出的对话框中,点击 “生成”(Generate),以 JWK(JSON Web Key)格式生成一个新密钥。注意:无需选择密钥长度,后续系统会自动更新。
- 将生成的密钥中 “k” 属性的值替换为前面 Base64 编码后的密钥。
- 点击 “确定”(OK)保存该密钥。
第 3 部分 - 修改并签名 JWT
- 返回 Burp 中继器中 “GET /admin” 请求的页面,切换到由扩展生成的 “JSON Web Token” 消息编辑标签页。
- 在载荷(payload)中,将 “sub” 声明(claim)的值修改为 “administrator”。
- 在该标签页底部,点击 “签名”(Sign),然后选择上一部分中你生成的密钥。
- 确保勾选 “不修改头部”(Don't modify header)选项,然后点击 “确定”(OK)。此时,修改后的令牌已使用正确的签名完成签名。
- 发送请求,观察到你已成功访问管理员面板。
- 在响应内容中,找到用于删除 “carlos” 的 URL(地址),即 “/admin/delete?username=carlos”。向此端点(endpoint)发送请求,即可完成该实验。