一流高职院校建设工作网站,西安网页公司,长沙百度网站制作,自助建站会出现什么问题前言 在众多的CTF平台当中#xff0c;作者认为CTFHub对于初学者来说#xff0c;是入门平台的不二之选。CTFHub通过自己独特的技能树模块#xff0c;可以帮助初学者来快速入门。具体请看官方介绍#xff1a;CTFHub。
作者更新了CTFHub系列#xff0c;希望小伙伴们多多支持…前言 在众多的CTF平台当中作者认为CTFHub对于初学者来说是入门平台的不二之选。CTFHub通过自己独特的技能树模块可以帮助初学者来快速入门。具体请看官方介绍CTFHub。
作者更新了CTFHub系列希望小伙伴们多多支持。
作者的CTFHub技能树汇总
CTFHub技能树Web汇总-CSDN博客
基础知识
看完文章在最底下就有flag。
这篇文章写的不错本来还想总结一下JSON Web Token但这篇其实已经把用到的知识都讲了弄懂这篇就够了。
敏感信息泄露
JWT 的头部和有效载荷这两部分的数据是以明文形式传输的如果其中包含了敏感信息的话就会发生敏感信息泄露。试着找出FLAG。格式为 flag{}。
是一个登录框随便输入登录 在存储里看到token了 用base64解密一下可以看到我们账号密码直接显示了这就是敏感信息泄露
FLAG也直接显示了注意要复制正确别把FL处的“}“也复制了
这个解法并不是很好一会我们有别的方法 注意
Header 和 Payload 串型化的算法是 Base64URL。
JWT 作为一个令牌token有些场合可能会放到 URL里比如 api.example.com/?tokenxxx。Base64 有三个字符、/和在 URL 里面有特殊含义所以要被替换掉被省略、替换成-/替换成_ 。
这里最好还是用专门的jwt解密网站https://jwt.io/
看着会更清楚
还是尝试登录输入两个admin复制token 用专门的网站解密 这个看着就清爽很多
然后把flag拼接起来即可 无签名
一些JWT库也支持none算法即不使用签名算法。当alg字段为空时后端将不执行签名验证。尝试找到 flag。
还是登录然后拿到token解密 根据题目的提示
应该是将alg字段设置为none这样后端将不执行签名验证。
同时我们将role改为admin试试 注意去掉
eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0 eyJ1c2VybmFtZSI6ImFkbWluIiwicGFzc3dvcmQiOiJhZG1pbiIsInJvbGUiOiJhZG1pbiJ9
然后用.连接起来再然后别忘了最后还得加个.用来连接签名虽然签名为空
eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJ1c2VybmFtZSI6ImFkbWluIiwicGFzc3dvcmQiOiJhZG1pbiIsInJvbGUiOiJhZG1pbiJ9. 弱密钥
如果JWT采用对称加密算法并且密钥的强度较弱的话攻击者可以直接通过蛮力攻击方式来破解密钥。尝试获取flag
这里很明显是要我们去进行JWT的弱密钥爆破
这里作者用的是c-jwt-cracker
GitHub - brendan-rius/c-jwt-cracker: JWT brute force cracker written in C
由于在kali上一直配不好遂在docker里使用。
先从上面链接里下载zip文件然后解压缩放入kali中作者的kali里已经安装docker了没有安装的可以去找个教程然后在该文件夹里打开终端这里作者给文件夹改了个名按照github里的指令执行 具体的命令github里面都有直接复制即可只需要构建镜像、运行这两步 安装完成后我们运行一下把CTFHub上的JWT复制一下替换github上给的实例进行爆破
出结果了作者的密钥是qrni 然后我们输入密钥在线网站会显示签名已验证
然后我们把role改为admin
复制JWT 将role是admin的JWT写入cookie然后刷新
出flag 修改签名算法
有些JWT库支持多种密码算法进行签名、验签。若目标使用非对称密码算法时有时攻击者可以获取到公钥此时可通过修改JWT头部的签名算法将非对称密码算法改为对称密码算法从而达到攻击者目的。
是一个登录框及源码 ?php
require __DIR__ . /vendor/autoload.php;
use \Firebase\JWT\JWT;class JWTHelper {public static function encode($payloadarray(), $key, $algHS256) {return JWT::encode($payload, $key, $alg);}public static function decode($token, $key, $algHS256) {try{$header JWTHelper::getHeader($token);$algs array_merge(array($header-alg, $alg));return JWT::decode($token, $key, $algs);} catch(Exception $e){return false;}}public static function getHeader($jwt) {$tks explode(., $jwt);list($headb64, $bodyb64, $cryptob64) $tks;$header JWT::jsonDecode(JWT::urlsafeB64Decode($headb64));return $header;}
}$FLAG getenv(FLAG);
$PRIVATE_KEY file_get_contents(/privatekey.pem);
$PUBLIC_KEY file_get_contents(./publickey.pem);if ($_SERVER[REQUEST_METHOD] POST) {if (!empty($_POST[username]) !empty($_POST[password])) {$token ;if($_POST[username] admin $_POST[password] $FLAG){$jwt_payload array(username $_POST[username],role admin,);$token JWTHelper::encode($jwt_payload, $PRIVATE_KEY, RS256);} else {$jwt_payload array(username $_POST[username],role guest,);$token JWTHelper::encode($jwt_payload, $PRIVATE_KEY, RS256);}setcookie(token, $token, time()1800);header(Location: /index.php);exit();} else {setcookie(token, );header(Location: /index.php);exit();}
} else {if(!empty($_COOKIE[token]) JWTHelper::decode($_COOKIE[token], $PUBLIC_KEY) ! false) {$obj JWTHelper::decode($_COOKIE[token], $PUBLIC_KEY);if ($obj-role admin) {echo $FLAG;}} else {show_source(__FILE__);}
}
?
这里输入admin及admin登录
打印出了我们的JWT 看一下加密方式是RS256role是guest 读一下源码这里发现要读出flag需要几个条件。
请求方式不是POST这个简单随便刷新一下就是GET就不是POST
cookie不为空且可以HS256解密需要换加密方式头部的alg字段也得由RS256改为HS256
role要是admin需要由guest修改为admin 综上我们编辑一下JWT的Header头部和Payload负载
{typ:JWT,alg:HS256}{username:admin,role:admin}
Base64编码一下 注意JWT是Base64URL。我们要去掉然后别忘了在头部和负载之间加上.
最后的结果是大家可以直接复制
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwicm9sZSI6ImFkbWluIn0.
把它打印出来的JWT的Header头部和Payload负载改为我们刚编辑的
然后用jwt_tool工具修改这里要注意在jwt_tool文件夹下将给我们的公钥写入publickey.pem jwt_tool工具生成JWT后按F12写入cookie中
然后再刷新不要点Login这是POST方法POST方法不会输出flag