CTFHub Web进阶-Json Web Token通关2:敏感信息泄露
目录
一、敏感泄露攻击原理
1、JWT 的结构组成
2、核心原理
3、攻击步骤详解
二、渗透实战
1、进入靶场
2、登录页面
3、获取flag
(1)方法1:
(2)方法2:
本文详细讲解CTFHub的Web进阶中Json Web Token的敏感信息泄露算法关卡的原理与渗透全流程。JWT由Header、Payload和Signature三部分组成,其中Payload仅经Base64编码而未加密,导致敏感信息可能被泄露。攻击步骤包括获取JWT令牌、解码分析Payload寻找FLAG。实战演示了两种获取FLAG的方法:通过BurpSuite解码JWT的Header和Payload部分拼接FLAG,以及使用jwt.io在线工具分析完整token。最终获取的FLAG格式为flag{18925cd54fba7f3d7779eaa2}。
一、敏感泄露攻击原理
1、JWT简介
JSON Web Token(JWT)是一种基于 JSON 格式的开放标准(RFC 7519),核心用途是在网络应用环境间安全传递声明信息,尤其适用于跨域认证、分布式站点单点登录(SSO)等场景,是当前主流的无状态身份认证解决方案之一。核心工作流程 如下所示。
-
登录签发:用户使用凭证登录,服务器验证成功后,生成包含用户身份的 JWT 并返回给客户端。
-
客户端存储:客户端(如浏览器)收到 JWT 后,将其安全地存储在本地。
-
携带访问:客户端在后续请求的 HTTP 头部中附带此 JWT。
-
服务器验证:服务器验证 JWT 的签名有效性和有效期,确认用户身份后处理请求。
1、JWT 的结构组成
JWT 是一个无换行的长字符串,通过点(.) 分隔为三个部分,每个部分均通过Base64URL编码(非加密,仅用于格式转换),三部分依次为Header(头部)、Payload(负载)、Signature(签名),格式示例:Header编码串.Payload编码串.Signature值。
-
头部(Header)是一个 JSON 对象,主要说明两个信息:
- 签名算法(
alg):比如 HS256、RS256 等,告诉服务器用什么算法验证签名。 - 令牌类型(
typ):固定为JWT,表明这是一个 JWT 令牌。示例:{"alg":"HS256","typ":"JWT"},编码后成为第一部分。
- 签名算法(
-
负载(Payload)也是 JSON 对象,用来存放实际数据(称为 “声明”),分两种:
- 标准声明(可选):如过期时间(
exp)、签发人(iss)等,方便跨系统通用。 - 自定义声明:开发者根据需求添加的信息,如用户 ID、角色(
role: "user")等。注意:这里默认不加密,不能放密码等敏感信息,编码后成为第二部分。
- 标准声明(可选):如过期时间(
-
签名(Signature)是 JWT 的安全核心,用来防止数据被篡改。生成方式是:用头部指定的算法,结合服务器的密钥(或私钥),对 “编码后的头部 + 编码后的负载” 进行加密计算,得到的结果就是签名,作为第三部分。服务器验证时,会重新计算签名并对比,一致则说明令牌未被篡改,有效。
简单说,JWT 就是 “头部(说明算法). 负载(带数据). 签名(防篡改)” 的组合,通过这三部分实现安全的数据传递和身份验证。
2、核心原理
CTFHub JWT “敏感信息泄露” 关卡的核心原理,是利用 JWT Payload(负载)默认不加密的特性,通过解码获取其中包含的敏感信息(如密钥、管理员账号、Flag 等),进而完成关卡突破。JWT 的 Payload 部分仅通过 Base64URL 编码(非加密)处理,任何人获取 JWT 令牌后,都可通过解码直接查看其中内容。若开发者在 Payload 中存放了敏感信息(如用于签名的密钥secret、管理员密码、Flag 等),就会导致信息泄露。
3、攻击步骤
JWT令牌的头部(Header)和载荷(Payload)部分仅经过了Base64URL编码,并未加密。这意味着任何能够获取到该令牌的人都可以直接解码并查看其中的全部内容。解题流程非常直接,主要分为以下几步:
-
获取JWT令牌:在挑战页面,通常是一个登录框,你可以输入任意的用户名和密码进行登录。登录成功后,服务器会返回一个JWT令牌,它可能被设置在网站的Cookie中,也可能直接在页面的响应体里显示出来。
-
解码与分析令牌:拿到令牌后,你需要对其进行解码。一个JWT令牌是一个由点号分隔的三部分字符串,形如
header.payload.signature。-
你可以使用在线的JWT解码工具(例如 jwt.io),或者使用Burp Suite的Decoder模块,甚至可以直接使用Linux命令行下的
base64解码命令(注意添加--decode参数并忽略填充)。 -
解码后,你会清晰地看到Header和Payload的JSON内容。你的目标就是仔细检查Payload部分,寻找其中是否包含直接的FLAG或者其他的敏感信息。
-
-
提交FLAG:一旦在解码后的Payload中找到FLAG,直接提交即可完成挑战。
二、渗透实战
1、进入靶场
页面提示“JWT 的头部和有效载荷这两部分的数据是以明文形式传输的,如果其中包含了敏感信息的话,就会发生敏感信息泄露。试着找出FLAG。格式为 flag{}”。

2、登录页面
输入用户名admin密码随机ljn登录,bp开启抓包,如下所示。

点击登录,bp抓包显示如下所示,注意到token中内容似乎是加密编码后内容。我们来分析其结构,一个 JWT 是由点号.分隔的三部分组成的长字符串,格式为 Header.Payload.Signature。
-
Header:包含令牌类型(typ)和签名算法(alg),经过 Base64Url 编码形成第一部分。
-
Payload:包含需要传递的声明(Claims),如用户身份、权限和过期时间,同样经过 Base64Url 编码形成第二部分。
-
Signature:对编码后的 Header 和 Payload 使用指定算法和密钥进行签名,确保令牌在传输过程中未被篡改。

3、获取flag
(1)方法1
选择第一部分,如下所示第一部分解密后是{"AG":"fba7f3d7779eaa2}","typ":"JWT","alg":"HS256"}

选择第二部分,如下所示解密后是{"username":"admin","password":"ljn","FL":"ctfhub{18925cd54"}

{"username":"admin","password":"ljn","FL":"ctfhub{18925cd54"}{"AG":"fba7f3d7779eaa2}","typ":"JWT","alg":"HS256"}
将两者拼接后就是FLAG{18925cd54 fba7f3d7779eaa2}
(2)方法2
从burpsuite中获取到token内容如下所示:
eyJBRyI6ImZiYTdmM2Q3Nzc5ZWFhMn0iLCJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwicGFzc3dvcmQiOiJsam4iLCJGTCI6ImN0Zmh1YnsxODkyNWNkNTQifQ.Fzg3t1iGXANC78I_HkstaCAfl9ara-e3gXvWFP68iEs
使用jwt加解密网站分析JSON Web Tokens - jwt.io,如下所示,拼接后为FLAG{18925cd54 fba7f3d7779eaa2}。

