0x01 解题思路
1、我们先打开网址,查看源码得到hint<!--hint:NNVTU23LGEZDG===-->
,这儿直接想到base64
解码,但是一直解不出来,后来试了试base32
解码,成功!(思维太局限了)。
2、解码成功后得到账号和密码kk:kk123
3、我们登录进去得到提示
diary
中提到了vim
,我们首先想到的就是源码泄露,于是我们直接用dirsearch
脚本扫,得到/src
,下载.swp
文件,然后用vim -r
恢复文件得到源码。
<?php
error_reporting(0);
require_once 'src/JWT.php';
const KEY = 'L3yx----++++----';
function loginkk()
{
$time = time();
$token = [
'iss'=>'L3yx',
'iat'=>$time,
'exp'=>$time+5,
'account'=>'kk'
];
$jwt = \Firebase\JWT\JWT::encode($token,KEY);
setcookie("token",$jwt);
header("location:user.php");
}
if(isset($_POST['username']) && isset($_POST['password']) && $_POST['username']!='' && $_POST['password']!='')
{
if($_POST['username']=='kk' && $_POST['password']=='kk123')
{
loginkk();
}
else
{
echo "账号或密码错误";
}
}
?>
从源码中我们可以看见cookie
使用了jwt
,同时我们得到了KEY = 'L3yx----++++----';
然后构造jwt替换浏览器中的token。
我这儿使用的网址是Encode or Decode JWTs
我们先输入原本的JWT String
和Signing Key
,然后修改account
,此时JWT String
就会发生改变,然后复制上面的JWT String
替换浏览器中的token
。就可以得到flag。
0x02 总结
1、有时候我们看不到源码就不能得到Signing Key
,我们可以进行爆破,成功还得看运气,贴上工具github地址jwt-crack
2、jwt的组成:
Header(头部)
Payload(负载)
Signature(签名)
中间用.
连接,有时候需要我们base64
解码。