以 CTFShow - Web346 为例,同样观察到返回包中指示访问 /admin,解密访问 /admin 的 JWT 值,观察到加密算法为 HS256,面向用户为 user。
因为这里的 JWT 使用了 HS256 加密,也就是签名有效且会对 Header 和 Claims 进行编码和加密处理,所以当不清楚密钥的情况下,直接修改 user 为 admin 是不行的。
这里考虑两种思路:1、爆破密钥,显然难度较大;2、尝试将加密算法置空,也就是 alg=none
同样,将 JWT 值发到 Decoder 模块,先 Base64 解码,将 HS256 替换为 none,user 替换为 admin 后,再 Base64 编码。
但需要注意的是,使用此方法要先将 Signature 部分删除掉,因为加密算法为 none 必须将签名置空,并且需要将 Header 和 Claims 分别处理后再用 . 号连接,因为实测直接一起处理是不行的。
最终的格式为:Header.Claims.(注意最后面还有一个 . 号)
重新访问 /admin,带上 admin 用户的 JWT 值,得到 Flag。
上述方法略为复杂,更方便的当然是使用工具,比如 jwt_tool、Burp 插件 JSON Web Tokens 等。
使用插件 JSON Web Tokens,将 HS256 替换为 none,user 替换为 admin,并删除 Signature 部分,重新发包即可。
jwt_tool 常用命令如下:
使用None算法
python3 jwt_tool.py JWT_HERE -X a
自定义修改生成
python3 jwt_tool.py JWT_HERE -T
使用字典破解
python3 jwt_tool.py JWT_HERE -C -d dictionary.txt
指定密码测试
python3 jwt_tool.py JWT_HERE -C -p password_here
需要注意的是,jwt_tool 最好是在 Linux 上运行,我使用的 Kali 运行,并且需要先导入几个包,命令如下:
python3 -m pip install termcolor cprint pycryptodomex requests
然后启动 jwt_tool,使用 -T 自定义修改模式,根据提示将 HS256 替换为 none,user 替换为 admin,最后会自动生成对应 JWT 值。
复制生成 JWT 值并删除 Signature 部分,重新发包即可获取 Flag。
2、暴力破解密钥
以 CTFShow - Web347 为例,同样访问 /admin 得到的是 user 的 JWT 值,尝试空加密算法无果。
由于加密算法为 HS256 对称加密,比较容易爆破密钥,所以考虑使用 jwt_tool 爆破密钥,最终得知密钥为 123456。
python jwt_tool.py eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTcwMTM3NTE3NywiZXhwIjoxNzAxMzgyMzc3LCJuYmYiOjE3MDEzNzUxNzcsInN1YiI6InVzZXIiLCJqdGkiOiJhMDE3MDdmNDRmN2RmOGI1Y2JlNWUxMjlhMGY1YzMxMSJ9.Vjqa5vYv9uRUqiaQpsDxlswGfK5n2umAp-NrY0p39bg -C -d key_dictionary.txt
在 jwt.io 输入密钥,修改 user 为 admin,重新生成 admin 用户的 JWT 值,发包即可获得 Flag。
3、源码泄露私钥(JWT中私钥用于签名,公钥用于验证)
以 CTFShow - Web349 为例,这一关给了一个 JS 文件,模拟的是源码泄露,具体代码如下:
代码解释
1、当GET请求发送到根路径(‘/’)时,会执行以下操作:
使用res.type()方法将响应的内容类型设置为html
使用fs.readFileSync()方法读取当前工作目录下的public/private.key文件,并将其内容赋值给privateKey变量
使用jsonwebtoken库的sign()方法生成一个JSON Web Token(JWT),其中包含用户信息为’user’,使用privateKey进行签名,使用RS256算法
使用res.cookie()方法将生成的JWT写入名为’auth’的cookie
使用res.end()方法发送响应内容为’where is flag?'的响应
2、当POST请求发送到根路径(‘/’)时,会执行以下操作:
设置响应内容类型为html
获取名为’auth’的cookie的值赋值给auth变量
使用fs.readFileSync()方法读取当前工作目录下的public/public.key文件,并将其内容赋值给cert变量
使用jsonwebtoken库的verify()方法验证auth变量中的JWT是否有效,使用cert公钥进行验证。
如果JWT中的用户信息为’admin’,则发送包含flag的响应;否则,发送包含’you are not admin’的响应
通过解密 JWT 得知其使用的加密算法为 RS256,和前面的不同是这里是非对称加密。
***在使用非对称加密算法的 JWT 中,私钥用于签名,公钥用于验证。***这是因为公钥是公开的,如果用公钥进行签名,那么攻击者便很容易伪造 JWT 了,显然不合理。
于是我们只要拿到用于签名的私钥,便可伪造 admin 用户的 JWT 拿到 Flag。这里通过泄露的 JS 代码得知私钥存放位置为当前目录下,于是直接访问下载 private.key。
拿到了私钥之后,利用其重新生成 admin 用户的 JWT 值。
这里我使用 Python 来生成,具体代码如下***(需要注意这段代码需要导入两个包,JWT 和 PyJWT)***
pip install JWT PyJWT
生成的 JWT 如下,将其以 POST 方式重新发送(泄露的 JS 代码得知的逻辑),得到 Flag 值。
总结:由泄露的 JS 代码得知验证逻辑,并得到私钥(用于签名)存放位置,利用私钥重新生成了 admin 用户的 JWT 拿到了 Flag,整个过程就像是一次身份的伪造。
疑问:为什么爆破使用对称加密算法(如HS256)的 JWT 的密钥容易,但爆破非对称加密(如RS256)却很难?
4、密钥混淆攻击(RS256 => HS256)
以 CTFShow - Web349 为例,这一关给了一整个源码包,其实模拟的也是源码泄露。
查看该源码包,发现里面有公钥 public.key 却没有私钥 private.key,于是无法像之前一样利用私钥重新生成 admin 用户的 JWT。
观察处理逻辑,签名使用的是 private.key,验证使用的是 public.key,我们已经得到了 public.key,那么要是签名也使用 public.key 不就万事大吉了吗?
于是考虑将加密算法替换为 HS256,这样签名和验证都使用同一个密钥 public.key,利用其生成 admin 用户的 JWT 即可获取 Flag。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)
一、网安学习成长路线图
网安所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、网安视频合集
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
三、精品网安学习书籍
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
四、网络安全源码合集+工具包
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
五、网络安全面试题
最后就是大家最关心的网络安全面试题板块
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算
以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!**](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算