CTFshow web入门 JWT模块题解

CTFshow - JWT

web345

访问网站, 给了一个cookie, 发现是jwt,按f12发现叫我们访问/admin 访问/admin,重定向到/admin/ 抓包,使用burp上的jwt editor插件查看jwt内容

Pasted
alg内容为None,说明默认没有校验签名,可以随意更改header和payload 这题很没有道理,把alg的内容更改为其它的任意内容访问/admin/就会返回flag
Pasted

web346

同样给了jwt,这里alg字段为HS256,应该考爆破 使用 hashcat -a 0 -m 16500 "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTc0Mzc4MTkxMSwiZXhwIjoxNzQzNzg5MTExLCJuYmYiOjE3NDM3ODE5MTEsInN1YiI6InVzZXIiLCJqdGkiOiI4NGZkOTI3NjczYmYwZTllYTg2ODQ4Y2UzMDBlMDEwZSJ9.y58GzeU6y3nwiZFg4r6Sf3WTxkRiG0EwKycE3Qvg5Jc" rockyou.txt或者jwt-cracker -t eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTc0Mzc4MTkxMSwiZXhwIjoxNzQzNzg5MTExLCJuYmYiOjE3NDM3ODE5MTEsInN1YiI6InVzZXIiLCJqdGkiOiI4NGZkOTI3NjczYmYwZTllYTg2ODQ4Y2UzMDBlMDEwZSJ9.y58GzeU6y3nwiZFg4r6Sf3WTxkRiG0EwKycE3Qvg5Jc -d rockyou.txt 注:jwt-cracker通过npm install --global jwt-cracker指令下载 爆破出了密钥为123456

使用burp的jwt Editor伪造jwt:New Symmetric Key -》点击生成 -》将Key栏中的k改为base64url编码后的123456(即MTIzNDU2)点击确认,之后我们在请求时的jwt中点击下方的sign,选择我们刚刚创建的密钥,就可以进行签名

这里把sub字段改为admin,进行签名,访问/admin/即可获得flag

第二种做法是空加密:即把alg的内容改为"none",签名部分删掉,再把payload种的sub字段改为admin,访问/admin/即可获得flag

web347

获得jwteyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTc0Mzc4MzMzNiwiZXhwIjoxNzQzNzkwNTM2LCJuYmYiOjE3NDM3ODMzMzYsInN1YiI6InVzZXIiLCJqdGkiOiI5MjRiYmIyMDRkNmI4ZGZjOGQ0ZmM4MDRlMjJkYTQwMSJ9.sBdlLF3IbawILlyxVmFMqsW1vABtO80As4AQxeic4rM其实也是爆破,跟上题一样,甚至jwt都是一样的(密钥都是123456),只不过空加密不行了,用上题的爆破方法即可

Pasted

web348

获得jwt,题目也直接说了爆破,直接爆破 jwt-cracker -t eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTc0Mzc4MzYyMCwiZXhwIjoxNzQzNzkwODIwLCJuYmYiOjE3NDM3ODM2MjAsInN1YiI6InVzZXIiLCJqdGkiOiI0ZjIyNDBhODMyYjdiMTViMDE1ODYzZWI1NTZmZmIyMSJ9.aeLiosexXXbs9tSmkUJp3FNCGlTUzRk2bY8dIP_hbdc -d rockyou.txt 得到密钥aaab 也可以用jwt-cracker的字符表爆破,因为密钥没规律,所以这种方法快点 jwt-cracker -t eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTc0Mzc4MzYyMCwiZXhwIjoxNzQzNzkwODIwLCJuYmYiOjE3NDM3ODM2MjAsInN1YiI6InVzZXIiLCJqdGkiOiI0ZjIyNDBhODMyYjdiMTViMDE1ODYzZWI1NTZmZmIyMSJ9.aeLiosexXXbs9tSmkUJp3FNCGlTUzRk2bY8dIP_hbdc -a 'qwertyuiopasdfghjklzxcvbnm'

用得到的密钥伪造签名访问/admin/得到flag

web349

这题给了源码

/* 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');
      }
    });
});

通过源码可知访问/private.key可获得私钥,访问/public.key可获得公钥 所以有两种做法 第一种:直接用私钥伪造RS256 使用burp的jwt Editor伪造jwt:New RSA Key -》Format选PEM -》点击生成 -》将Key栏中的内容改为我们获取的私钥内容,点击确认,之后我们在请求时的jwt中点击下方的sign,选择我们刚刚创建的密钥,就可以进行签名

改jwt中user改为admin,然后伪造签名即可

第二种:将alg改为HS256,用公钥伪造HS256 因为其在验证jwt时没有指定 方法为HS256,所以猜测jwt.verify这个方法应该是通过读取alg来确定验证方法,我们改为HS256,即对称加密,所以服务端指定验证的密钥为public.key, 我们也用pyblic.key中的内容进行签名伪造

web350

这题相对于上题的区别就只是访问不到私钥了,所以用上题的第二种方法 我们还是使用burpsuite的JWT Editor 先将密钥进行base64url编码

Pasted
将结果导入jwt editor的k字段
Pasted

将jwt的user字段改为admin 然后点下面的sign,选择我们刚刚创建的密钥,进行签名

Pasted
然后使用post方法访问即可获得flag
Pasted

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇