CTF-Show-JWT系列

夏目^_^ / 2024-03-03 / 原文

CTF-Show-JWT系列

Problem 1

前置知识

img

思路

尝试访问:
https://d6bd63c3-e67e-477a-ba67-fc6c81604997.challenge.ctf.show/index.php/admin/

抓包发现auth为一串base64编码,对其进行解码后发现:这是jwt认证的token。

img

我们仔细观察发现,该jwt采用空算法加密,这就代表着我们可以随意篡改明文数据,来绕过认证。

通过HackBar工具,将user改为admin,再进行base64编码,再放到数据包中,尝试访问该链接。

img

得到flag

img

Problem 2

前置知识

这里简单说一下,JWT的认证过程:

JWT字符串有三部分构成:header、payload和verify

  • header存放加密算法等信息
  • payload存放明文数据
  • verify存放加密密钥等信息

这三个部分均会base64编码,用.来连接。

当用户A给用户B发送数据时(假设,用户A和用户B相互得知密钥),JWT函数会将数据+密钥采用指定算法加密,得到密文。

当用户B接受到数据时,会尝试使用密钥+数据采用指定算法加密,将加密后的密文和所得到的密文进行比较,如果相等,那么数据没有被恶意篡改,否则就会被恶意篡改。

由于中间人不知道密钥,所以当他尝试使用未知密钥+篡改后的数据采用指定算法加密后,将密文发送给用户,用户使用自己的密钥和篡改后的明文采用指定算法加密后,发现密文比较不正确,判断数据被篡改。

当然,在以上过程中如果中间人知道了密钥,那么就无法被判断是篡改数据而是用户之间正常的交互数据。

思路

将拿到的JWT字符串进行解码,得到如下信息:

img

发现不是空算法加密,而是采用了HS256算法进行加密,因此我们无法直接篡改明文数据,需要得知密钥才可以。

我们尝试密钥为123456(存在弱口令问题),user修改为admin

将修改后的JWT字符串放到数据包中,访问之前提到的链接,最终得到flag

img

img