JWT authentication bypass via unverified signature(通过未验证签名绕过 JWT 身份验证)

本练习使用基于 JWT 的机制来处理会话。由于实现缺陷,服务器不会验证它收到的任何 JWT 的签名。

要解决该实验室问题,请修改您的会话令牌以访问 的管理面板 ,然后删除用户。/admincarlos

您可以使用以下凭据登录自己的帐户:wiener:peter

  1. 在实验环境中,登录你自己的账号。

  1. 在 Burp(抓包工具)中,进入 “代理(Proxy)”>“HTTP 历史记录(HTTP history)” 标签页,找到登录后的请求。观察到你的会话 Cookie 是一个 JWT(JSON Web Token),对应的请求为 “GET /my-account”。

  1. 双击该令牌的载荷(payload)部分,在 “检查器(Inspector)” 面板中查看其解码后的 JSON 格式。

注意到 “sub” 声明(claim)中包含你的用户名。将此请求发送到 “Burp 中继器(Burp Repeater)”。

  1. 在 Burp 中继器中,将请求路径修改为 “/admin” 并发送请求。观察到只有以 “administrator”(管理员)用户身份登录时,才能访问管理员面板

  1. 再次选中 JWT 的载荷部分。在检查器面板中,将 “sub” 声明的值从 “wiener”(普通用户名,示例)修改为 “administrator”,然后点击 “应用更改(Apply changes)”。

  1. 再次发送请求。观察到你已成功访问管理员面板

  1. 在响应内容中,找到用于删除 “carlos”(目标用户)的 URL(地址),该 URL 为 “/admin/delete?username=carlos”。

向此端点(endpoint)发送请求,即可完成该实验。

 

JWT authentication bypass via flawed signature verification

(通过存在缺陷的签名验证绕过JWT身份验证 )

  1. 在实验环境中,登录你自己的账号。
  1. 在 Burp(抓包工具)中,进入 “代理(Proxy)”>“HTTP 历史记录(HTTP history)” 标签页,找到登录后的 “GET /my-account” 请求。观察到你的会话 Cookie 是一个 JWT(JSON Web Token)。

  1. 双击该令牌的载荷(payload)部分,在 “检查器(Inspector)” 面板中查看其解码后的 JSON 格式。注意到 “sub” 声明(claim)中包含你的用户名。将此请求发送到 “Burp 中继器(Burp Repeater)”

  1. 在 Burp 中继器中,将请求路径修改为 “/admin” 并发送请求。观察到只有以 “administrator”(管理员)用户身份登录时,才能访问管理员面板。

  1. 再次选中 JWT 的载荷部分。在检查器面板中,将 “sub” 声明的值修改为 “administrator”,然后点击 “应用更改(Apply changes)”。

  1. 选中 JWT 的头部(header)部分,接着通过检查器将 “alg” 参数(算法参数)的值修改为 “none”,点击 “应用更改(Apply changes)”。

  1. 在消息编辑器(message editor)中,删除 JWT 中的签名(signature)部分,但需注意保留载荷后面的末尾点号(.)。

  1. 发送请求,观察到你已成功访问管理员面板。
  2. 在响应内容中,找到用于删除 “carlos”(目标用户)的 URL(地址),该 URL 为 “/admin/delete?username=carlos”。向此端点(endpoint)发送请求,即可完成该实验。

 

JWT authentication bypass via weak signing key
(通过弱签名密钥绕过 JWT 身份验证)

第 1 部分 - 暴力破解密钥

  1. 在 Burp 中,从 BApp 商店加载 JWT 编辑器扩展(JWT Editor extension)。
  2. 在实验环境中,登录你自己的账号,并将登录后的 “GET /my-account” 请求发送到 Burp 中继器(Burp Repeater)。
  3. 在 Burp 中继器中,将请求路径修改为 “/admin” 并发送请求。观察到只有以 “administrator”(管理员)用户身份登录时,才能访问管理员面板。
  4. 复制该 JWT(JSON Web Token)并对其密钥进行暴力破解。你可以使用 hashcat 工具,通过以下命令实现:
    hashcat -a 0 -m 16500 <你的JWT令牌> /密钥字典文件路径/jwt.secrets.list
    若使用 hashcat,命令执行后会输出 JWT 令牌,其后紧跟对应的密钥。若操作无误,结果会显示该弱密钥为 “secret1”。

注意:若多次运行此命令,需添加 “--show” 参数,才能再次在控制台输出结果。

第 2 部分 - 生成伪造的签名密钥

  1. 使用 Burp 解码器(Burp Decoder),对前一部分中暴力破解得到的密钥进行 Base64 编码。
  2. 在 Burp 中,进入 “JWT 编辑器密钥”(JWT Editor Keys)标签页,点击 “新建对称密钥”(New Symmetric Key)。
  3. 在弹出的对话框中,点击 “生成”(Generate),以 JWK(JSON Web Key)格式生成一个新密钥。注意:无需选择密钥长度,后续系统会自动更新。
  4. 将生成的密钥中 “k” 属性的值替换为前面 Base64 编码后的密钥。
  5. 点击 “确定”(OK)保存该密钥。

第 3 部分 - 修改并签名 JWT

  1. 返回 Burp 中继器中 “GET /admin” 请求的页面,切换到由扩展生成的 “JSON Web Token” 消息编辑标签页。
  2. 在载荷(payload)中,将 “sub” 声明(claim)的值修改为 “administrator”。
  3. 在该标签页底部,点击 “签名”(Sign),然后选择上一部分中你生成的密钥。
  4. 确保勾选 “不修改头部”(Don't modify header)选项,然后点击 “确定”(OK)。此时,修改后的令牌已使用正确的签名完成签名。
  5. 发送请求,观察到你已成功访问管理员面板。
  6. 在响应内容中,找到用于删除 “carlos” 的 URL(地址),即 “/admin/delete?username=carlos”。向此端点(endpoint)发送请求,即可完成该实验。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐