每日一题 —— [PolarCTF]jwt¶
打开页面是一个登陆界面,我们不知道任何信息,那么我们只能先进行注册。我们随便进去注册一番,生成了一个账号密码,然后利用他来进行登陆。在这里我们使用的是 root:root
来登陆。既然可以用 root
成功注册,说明我们这道题关键不是 root
账户。我们换个号注册,发现 admin
账号不能注册。也就是说,我们最后需要登陆 admin
用户来进行下一步的解题。
我们登陆 root
账户进入其中,然后抓包查看一下网络信息,因为一般登陆状态和 cookie
有关。看到 cookie
中有两个值,一个是 session
,一个是 JWT
。session
我们无法解密,而且根据题目,我们需要对 JWT
下手。我查询了有关 jwt 的资料,发现 jwt 由 .
号分为三段,其中第 1 段和第 2 段都是一段 json 代码进行 base64 编码而来。我们把这一串 jwt 直接丢进 jwt 的解码网站,看到有两个 json:
其中第一段是指,这一段 jwt 是使用 HS256
加密的。而 JWT
这个值一般不用管。看到第二段 json, 可以看到我们登陆用的用户就是 username
字段的值。
既然想要伪造成 admin
,那么我们就需要获得新的 jwt 的第三段密文的值。根据 jwt 的使用方法,服务器会根据前两段的密文值,利用所给的加密算法,以及服务器自己存着的一段 secret key
进行加盐加密来进行比对验证。想要把第二段的 username
的值改成 admin
,第三段密文的内容必然需要重新加密一遍。也就是说,我们需要获取服务器上存着的这一段 secret key
。
正常情况下,我们无法获得,但是因为 HS256
是一个对称加密算法,一旦我们获得了解密算法,其相应的加密算法也就被我们得到了。网络上已经有了一些通过一段 jwt 数据来爆破其中解密算法和相应的 secret key
。这里我们使用的是 c-jwt-cracker
软件。
git clone git@github.com:brendan-rius/c-jwt-cracker.git
cd c-jwt-cracker
docker build . -t jwtcracker
docker run -it --rm jwtcrack:latest eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InJvb3QifQ.lssUBDi1U5qpBV-naCagX6GfgwejCjqXpuXnGgCTrQA
经过一番爆破,这个软件给出的结果是 SYSA
,为了验证一下,我们把这一串 jwt 丢进 CyberChef 中使用 JWT verify
模块,并在其中 secret key
那一栏写上 SYSA
,发现果然出现了明文信息。 也就是说,我们的这个 secret key
是正确的。
接下来就开始构造 payload 了。首先先在 CyberChef 中把模块 JWT sign
拖进来,然后输入 SYSA
密钥。接下来 ,我们在明文处输入我们要的登陆账户:
然后,我们就获得了最终 payload:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNzE4NDY0MzM2fQ.jKdi97fo0lp9t8J3NW5jGetxNt8Y2LSUVokr5APaONQ
最后,把这一串 cookie 存入浏览器 devtools 的应用程序的 cookie 存储中,刷新页面,进入“个人中心”,就得到了 flag.
文章热度:0次阅读