1. 从零认识JWT:它到底是什么,为什么这么流行?
大家好,我是老张,在安全圈和开发领域摸爬滚打了十几年。今天咱们不聊那些虚头巴脑的理论,直接上手干。很多朋友一听到JWT(JSON Web Token)就觉得头大,什么签名、载荷、头部,一堆术语。其实你完全可以把它想象成一张“数字电影票”。
你去看电影,前台验证了你的购票信息后,会给你一张印有座位号、电影名、时间的实体票。接下来你进影厅,检票员只看这张票,而不会再联系前台核对你的购票记录。JWT就是这张“数字票”。用户登录(好比购票),服务器验证成功后,生成一个JWT字符串(好比出票)返回给客户端。之后客户端每次请求都带上这个JWT(好比出示电影票),服务器只要验证这张“票”的真伪和有效性就行,不用再去查数据库里的“购票记录”(Session)。这样做的好处太明显了:服务器轻松啊,变成了无状态,特别适合现在分布式、微服务这种架构,扩展起来非常方便。
那这张“票”长啥样呢?它是一个由点号分隔的三段式字符串,像这样:xxxxx.yyyyy.zzzzz。这三部分分别是头部(Header)、载荷(Payload)和签名(Signature)。头部通常声明了令牌类型和签名算法,比如HS256。载荷就是真正的“票面信息”,比如用户ID、用户名、过期时间等等,这些信息你可以直接解码看到(所以千万别在里面存密码)。签名部分最关键,它是把头部和载荷用点号连起来,加上一个只有服务器才知道的“密钥”(Secret),经过特定算法(比如HS256)计算出来的。这个签名的唯一作用就是防伪。如果有人篡改了头部或载荷的内容,那么重新计算的签名肯定和原来的对不上,服务器一验就知道票是假的。
我刚开始接触时,最喜欢去jwt.io这个网站玩。你把一个JWT贴进去,它能立刻给你解码出头部和载荷,非常直观。你也可以在那里手动改改内容,换个算法试试,立刻就能看到JWT字符串的变化。我建议所有新手都先去那里感受一下,比读十篇文档都管用。理解了JWT就是一张可自解析、带防伪的“票”,后面的所有攻击手法,其实都是围绕“如何伪造一张能让检票员认不出来的假票”展开的。
2. 靶场热身:搭建你的第一个JWT攻击实验室
光说不练假把式,咱们今天所有的操作,都会在一个绝对安全、合法的环境里进行——PortSwigger的Web安全学院靶场。PortSwigger就是开发Burp Suite的那家公司,他们的靶场质量极高,完全针对真实漏洞场景设计,而且是免费的。你不需要自己去搭建一个漏洞百出的测试网站,直接用它提供的现成环境就行。
首先,打开浏览器,访问 PortSwigger 的 Web 安全学院。找到 “JSON Web Tokens” 这个主题模块。里面有一系列的实验(Labs),从易到难排列。我们今天的目标,就是把这些实验一个一个“破解”掉。每个实验都是一个模拟的真实Web应用,存在特定的JWT安全漏洞。你的任务就是利用这些漏洞,最终以管理员(administrator)身份完成某个操作(比如删除用户)。
工欲善其事,必先利其器。我们的核心工具就是Burp Suite,我习惯叫它BP。你需要安装好Burp Suite Professional版或者Community版(社区版功能也足够我们学习)。然后,有一个插件必须装:JWT Editor。你可以在BP的BApp Store里直接搜索安装。这个插件是神器,它能让你在BP的Repeater、Intruder等模块里直接可视化地编辑、解码、签名JWT,省去了手动Base64编解码和拼接的麻烦。装好之后,你的BP界面里会多出一个“JSON Web Token”的标签页。
接下来,配置浏览器代理,让它将所有流量经过Burp Suite。这个基础步骤我就不赘述了,网上教程一大堆。关键是要把BP的拦截(Intercept)打开,然后去访问靶场提供的实验链接。当你用给定的普通用户账号(比如wiener:peter)登录时,你就能在BP的HTTP历史记录里抓到那个包含JWT的请求了。通常,JWT会被放在HTTP请求头的Authorization字段里,格式为Bearer <你的JWT令牌>。看到那一长串点号分隔的字符串,我们的战斗就正式开始了

377

被折叠的 条评论
为什么被折叠?



