我知道你的JWT私钥?

admin 2026-03-10 02:08:36 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文记录了GlobalTrustBankCTF挑战的解题过程。作者通过网页源码发现硬编码凭据登录系统,获取JWT令牌后利用JohntheRipper破解弱密钥。通过修改payload伪造管理员令牌并替换Cookie,最终成功获取Flag。文章强调了信息收集的重要性,并总结了源码凭据泄露与JWT弱密钥的风险。 综合评分: 84 文章分类: CTF,WEB安全,漏洞分析,渗透测试,实战经验


cover_image

我知道你的 JWT 私钥?

haidragon haidragon

安全狗的自我修养

2026年3月9日 12:29 湖南

官网:http://securitytech.cc

这是 Cyber Premier League 举办的另一个挑战,由 sanifu organization 组织。 Flag 被隐藏在一个页面中,而这个页面只有管理员才能访问

挑战名称: Global Trust Bank 描述: 无描述 类别: Web 难度: Medium(中等) 平台: CTFZone


说明 我准备了一个非常详细的 walkthrough(完整解题过程),逐步展示如何攻击 Web CTF 挑战,即使**不使用或仅使用少量高级工具(如 msf、burp 等)**也可以完成。

感谢所有帮助准备本 Writeup 的朋友。


Global Trust Bank 是一家通过 Web 应用提供服务的银行。 但在它的平台中存在漏洞,需要找出漏洞、利用它并提交 flag。

(在真实环境中,我们利用漏洞获取 PoC,然后提交漏洞报告给公司 —— 我们不是破坏者,我们是保护者。)

下面是获取 flag(识别漏洞)的步骤。


Step Alpha:访问银行门户

通过提供的 URL 访问网站。

登录页面

我阅读了网站上的几乎所有信息,并点击登录页面。 尝试了一些常见默认凭据:

admin:admin@123
admin:admin
admin:password

但都没有成功。

我尝试寻找注册页面,但弹出提示:

“请前往最近的银行分行注册”

糟糕,时间在流逝,flag 还没拿到。

这时我意识到一个问题:

我跳过了关键步骤 —— 枚举(Enumeration)

很多所谓的“黑客”喜欢直接测试 payload, 却忘记了最重要的一步:

信息收集(Information Gathering)

也就是 Enumeration


Step B:Web 技术、端点和目录枚举

我打开终端,使用 WhatWeb 扫描目标网站,识别使用的技术栈。

使用工具:

WhatWeb

但结果对我来说没什么有价值的信息。


说明

枚举目标系统使用的技术可以:

  • 暴露版本号
  • 根据版本查找已知漏洞

例如:

ExploitDB

这个网站包含大量已公开漏洞和 exploit。


接下来我使用另一个工具:

Gobuster

这个工具可以发现:

  • 隐藏的目录
  • API endpoint
  • 文件路径

执行命令:

gobuster dir -u http://labs.ctfzone.com:7666 -w /usr/share/wordlists/dirb/common.txt

结果:

结果显示:

只有已认证用户才能访问 dashboard, 否则会被重定向到登录页面。

仍然没有有用信息。


Step C:检查目标(信息收集)

突然我想到一个问题:

你检查过“人眼看不到的内容”吗?

于是:

右键首页 选择 View Page Source(查看页面源代码)

在首页中唯一让我感兴趣的是:

<ahref="/login"class="btn">Online Banking Login</a>

页面源码如下:

<!DOCTYPE html>
<htmllang="en">
<head>
<metacharset="UTF-8">
<metaname="viewport"content="width=device-width, initial-scale=1.0">
<title>GlobalTrust Bank - Secure Online Banking</title>
<linkrel="stylesheet"href="style.css">
</head>
<body>
<divclass="container">
<header>
<divclass="bank-logo">
<div>
<h1>GlobalTrust Bank</h1>
<pclass="tagline">Secure Banking Since 1965</p>
</div>
</div>
<navclass="nav-menu">
<ahref="/"class="btn btn-secondary">Home</a>
<ahref="/login"class="btn">Online Banking Login</a>
</nav>
</header>

随后我查看了 登录页面源码

结果发现:

<!-- test_user=clemence pw=snf&&ctfzonepass@2026 -->

完整代码:

<!DOCTYPE html>
<htmllang="en">
<head>
<metacharset="UTF-8">
<metaname="viewport"content="width=device-width, initial-scale=1.0">
<title>GlobalTrust Bank - Secure Login</title>
<linkrel="stylesheet"href="style.css">
</head>
<body>
<!-- test_user=clemence pw=snf&&ctfzonepass@2026 -->
<divclass="container">
<header>
<divclass="bank-logo">
<div>
<h1>GlobalTrust Bank</h1>
<pclass="tagline">Secure Banking Since 1965</p>
</div>
</div>
<navclass="nav-menu">
<ahref="/"class="btn btn-secondary">Back to Home</a>
</nav>
</header>

宝藏就在这里。

作者把测试用户凭据藏在 HTML 注释中

于是我使用这个账号登录,并打开浏览器开发者工具的 Network 面板。


登录成功后,在 Network 中出现三个 endpoint:

/login
/dashboard
/user

/login 返回的 Response Headers 中包含:

authToken

值是一个 JWT Token


分析 JWT Token

Token 内容:

isAdmin: false

说明当前用户不是管理员。


渗透测试思路

目标:

权限提升(Privilege Escalation)

JWT 中存在字段:

isAdmin

如果把:

false → true

就可以成为管理员。

但问题是:

JWT Token 是 签名的

要修改 Token:

  1. 需要获取 签名密钥
  2. 使用相同密钥重新签名

进一步枚举 API

查看 /api/user 请求时发现:

Token 存储在 Cookie 中。

于是我想:

是否存在:

/api/admin
/api/flag
/api/register

于是再次运行 Gobuster:

gobuster dir -u http://labs.ctfzone.com:7666/api -w /usr/share/wordlists/dirb/common.txt

结果:

发现两个 endpoint:

/api/user
/api/flag

访问 /api/flag

返回:

{"error":"Admin access required"}

说明:

必须是管理员 Token。


Step D:破解 JWT 密钥

常见 JWT 破解工具:

  • hashcat
  • john
  • jwt-cracker

本挑战使用:

John the Ripper

成功破解密钥:

n1c2a3h4t516i7e890r

验证密钥:

识别加密格式:


Step E:生成管理员 Token

使用工具:

CyberChef

修改 payload:

// 原始
{
"userId":&nbsp;2,
"username":&nbsp;"clemence",
"isAdmin":&nbsp;false,
"balance":&nbsp;3000
}

// 修改
{
"userId":&nbsp;2,
"username":&nbsp;"clemence",
"isAdmin":&nbsp;true,
"balance":&nbsp;3000
}

生成新的 JWT Token。


Step Omega:替换 Cookie

进入浏览器:

Inspect → Application → Cookies

把 Cookie 中的 token 替换为新的管理员 token。

刷新页面。

成功获取 Flag 😎

snf{JWT_cr4ck3d_4dm1n_4cc3ss_gr4nt3d_458734659457}

Global Trust Bank 漏洞总结

1️⃣ 页面源码存在硬编码凭据

<!-- test_user=clemence pw=xxx -->

风险:

  • 未授权访问
  • 数据泄露
  • 身份冒充

2️⃣ JWT 使用弱密钥

n1c2a3h4t516i7e890r

风险:

  • 容易被字典破解
  • 可以伪造管理员 Token

建议:

  • 使用强随机密钥
  • 定期轮换密钥

总结

这个挑战说明:

所有攻击都始于 Enumeration(枚举)

即使有多种解法,第一步永远是:

Information Gathering

感谢阅读。

  • 公众号:安全狗的自我修养
  • vx:2207344074
  • http://gitee.com/haidragon
  • http://github.com/haidragon
  • bilibili:haidragonx

#

#


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:安全狗的自我修养 haidragon haidragon《我知道你的 JWT 私钥?》

评论:0   参与:  0