跳转至

每日一题 —— [PolarCTF]jwt

题目地址:https://www.polarctf.com/#/page/challenges

打开页面是一个登陆界面,我们不知道任何信息,那么我们只能先进行注册。我们随便进去注册一番,生成了一个账号密码,然后利用他来进行登陆。在这里我们使用的是 root:root 来登陆。既然可以用 root 成功注册,说明我们这道题关键不是 root 账户。我们换个号注册,发现 admin 账号不能注册。也就是说,我们最后需要登陆 admin 用户来进行下一步的解题。

我们登陆 root 账户进入其中,然后抓包查看一下网络信息,因为一般登陆状态和 cookie 有关。看到 cookie 中有两个值,一个是 session ,一个是 JWTsession 我们无法解密,而且根据题目,我们需要对 JWT 下手。我查询了有关 jwt 的资料,发现 jwt 由 . 号分为三段,其中第 1 段和第 2 段都是一段 json 代码进行 base64 编码而来。我们把这一串 jwt 直接丢进 jwt 的解码网站,看到有两个 json:

{
  "typ": "JWT",
  "alg": "HS256"
}
{
  "username": "root"
}

其中第一段是指,这一段 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 密钥。接下来 ,我们在明文处输入我们要的登陆账户:

{"username":"admin"}

然后,我们就获得了最终 payload:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiaWF0IjoxNzE4NDY0MzM2fQ.jKdi97fo0lp9t8J3NW5jGetxNt8Y2LSUVokr5APaONQ

最后,把这一串 cookie 存入浏览器 devtools 的应用程序的 cookie 存储中,刷新页面,进入“个人中心”,就得到了 flag.


文章热度:0次阅读