打开题目是一个登入界面有注册界面,尝试注入和注册admin用户后无果。(登入后有getflag按钮,但我们没权限)
查看源码发现存在/static/js/app.js
进行访问后似乎看到了源码,但是又无法发现漏洞点。只有提示:
1 | /** |
根据wp我们可以知道框架存在controllers/api.js
且极为重要,大概就是说,检查session中的username是为admin时就可出flag。
JWT利用 设置secretid为数组加密算法为空
已经记录过什么是JWT 【什么是JWT】
这里的利用方法是: 设置secretid为数组,加密算法为空
推荐 【JWT解编码网站】
解题步骤
- 创建一个用户,然后进行登入同时抓包。
- 看到post的数据为:
1
username=mayi&password=mayi&authorization=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzZWNyZXRpZCI6MCwidXNlcm5hbWUiOiIxMjMiLCJwYXNzd29yZCI6IjEyMyIsImlhdCI6MTU4OTg3NDUwOH0.V7Zdr4KDSV8O6ON947BTdox6lPAe2MgdlRPcaWUGsYw
- 我们将authorization的值以点
(.)
分为3段,先看头也就是第一段进行base64解密,将头部的alg值改为none
再base64加密记得特殊字符的处理 如=
就省略,再看payload,也是将其base64解码然后将secretid改为[]
(空数组)username改为admin
随后base64编码一样注意特殊字符。最后签名删掉也就是第3段(点需要保留) 使用这个【base64在线工具】 其它的结果可能不对。注意,虽然签名没了但是那个点必须要打上1
2header : {"alg":"none","typ":"JWT"}
paylaod: {"secretid":[],"username":"admin","password":"mayi","iat":1589875776} - 最后我们登入后点击getflag,然后查看放回包即可看到flag