当前位置: 首页 > news >正文

web-JSON Web Token-CTFHub

前言

  在众多的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/?token=xxx)。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($payload=array(), $key='', $alg='HS256') {return JWT::encode($payload, $key, $alg);}public static function decode($token, $key, $alg='HS256') {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

看一下,加密方式是RS256,role是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)

相关文章:

web-JSON Web Token-CTFHub

前言 在众多的CTF平台当中&#xff0c;作者认为CTFHub对于初学者来说&#xff0c;是入门平台的不二之选。CTFHub通过自己独特的技能树模块&#xff0c;可以帮助初学者来快速入门。具体请看官方介绍&#xff1a;CTFHub。 作者更新了CTFHub系列&#xff0c;希望小伙伴们多多支持…...

langchain教程-11.RAG管道/多轮对话RAG

前言 该系列教程的代码: https://github.com/shar-pen/Langchain-MiniTutorial 我主要参考 langchain 官方教程, 有选择性的记录了一下学习内容 这是教程清单 1.初试langchain2.prompt3.OutputParser/输出解析4.model/vllm模型部署和langchain调用5.DocumentLoader/多种文档…...

Postgresql的三种备份方式_postgresql备份

这种方式可以在数据库正在使用的时候进行完整一致的备份&#xff0c;并不阻塞其它用户对数据库的访问。它会产生一个脚本文件&#xff0c;里面包含备份开始时&#xff0c;已创建的各种数据库对象的SQL语句和每个表中的数据。可以使用数据库提供的工具pg_dumpall和pg_dump来进行…...

WebAssembly:前后端开发的未来利器

引言 在互联网的世界里&#xff0c;前端和后端开发一直是两块重要的领域。而 JavaScript 长期以来是前端的霸主&#xff0c;后端则有各种语言诸如 Java、Python、Node.js、Go 等等。然而&#xff0c;近年来一个名为 WebAssembly (Wasm) 的技术正在逐渐改变这一格局。它的高性能…...

Mac下使用brew安装go 以及遇到的问题

首先按照网上找到的命令进行安装 brew install go 打开终端输入go version&#xff0c;查看安装的go版本 go version 配置环境变量 查看go的环境变量配置&#xff1a; go env 事实上安装好后的go已经可以使用了。 在home/go下新建src/hello目录&#xff0c;在该目录中新建…...

【Leetcode 每日一题】47. 全排列 II

问题背景 给定一个可包含重复数字的序列 n u m s nums nums&#xff0c;按任意顺序 返回所有不重复的全排列。 数据约束 1 ≤ n u m s . l e n g t h ≤ 8 1 \le nums.length \le 8 1≤nums.length≤8 − 10 ≤ n u m s [ i ] ≤ 10 -10 \le nums[i] \le 10 −10≤nums[i]≤…...

车型检测7种YOLOV8

车型检测7种YOLOV8&#xff0c;采用YOLOV8NANO训练&#xff0c;得到PT模型&#xff0c;转换成ONNX&#xff0c;然后OPENCV的DNN调用&#xff0c;支持C&#xff0c;python,android开发 车型检测7种YOLOV8...

C语言按位取反【~】详解,含原码反码补码的0基础讲解【原码反码补码严格意义上来说属于计算机组成原理的范畴,不过这也是学好编程初级阶段的必修课】

目录 概述【适合0基础看的简要描述】&#xff1a; 上述加粗下划线的内容提取版&#xff1a; 从上述概述中提取的核心知识点&#xff0c;需背诵&#xff1a; 整数【包含整数&#xff0c;负整数和0】的原码反码补码相互转换的过程图示&#xff1a; 过程详细刨析&#xff1a;…...

面对全球化的泼天流量,出海企业如何观测多地域网络质量?

作者&#xff1a;俞嵩、白玙 泼天富贵背后&#xff0c;技术挑战接踵而至 随着全球化进程&#xff0c;出海、全球化成为很多 Toc 产品的必经之路&#xff0c;保障不同地域、不同网络环境的一致的用户体验成为全球化应用的不得不面对的问题。在跨运营商、跨地域的网络环境中&am…...

『python爬虫』获取免费IP代理 搭建自己的ip代理池(保姆级图文)

目录 1. 环境搭建2. 获取爬虫ip3. 启动本地flask api接口服务4. 封装方法例子代码5. 自定义抓取免费ip的代理站规则6. 自定义规则示例总结欢迎关注 『python爬虫』 专栏,持续更新中 欢迎关注 『python爬虫』 专栏,持续更新中 1. 环境搭建 这边建议python3.7-3.11版本,redis …...

21.命令模式(Command Pattern)

定义 命令模式&#xff08;Command Pattern&#xff09; 是一种行为型设计模式&#xff0c;它将请求封装成一个对象&#xff0c;从而使您可以使用不同的请求、队列、日志请求以及支持撤销操作等功能。命令模式通过将请求&#xff08;命令&#xff09;封装成对象&#xff0c;使…...

深入探索 C++17 特征变量模板 (xxx_v)

文章目录 一、C++类型特征的前世今生二、C++17特征变量模板闪亮登场三、常见特征变量模板的实际应用(一)基本类型判断(二)指针与引用判断四、在模板元编程中的关键作用五、总结与展望在C++的持续演进中,C++17带来了许多令人眼前一亮的特性,其中特征变量模板(xxx_v)以其…...

【Day32 LeetCode】动态规划DP Ⅴ 完全背包

一、动态规划DP Ⅴ 完全背包 1、完全背包理论 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09;&#xff0c;求解将哪些物品装入背包里物品价值总和…...

景区如何打造高质量游览观光车,提高人流量?

景区如何打造高质量游览观光车&#xff0c;提高人流量&#xff1f; 在旅游业蓬勃发展的今天&#xff0c;各大景区迎来了前所未有的游客热潮。尤其是在春节、五一、国庆等节假日期间&#xff0c;游客数量更是激增。作为景区交通的重要组成部分&#xff0c;游览观光车不仅承载着…...

【Ubuntu】ARM交叉编译开发环境解决“没有那个文件或目录”问题

【Ubuntu】ARM交叉编译开发环境解决“没有那个文件或目录”问题 零、起因 最近在使用Ubuntu虚拟机编译ARM程序&#xff0c;解压ARM的GCC后想要启动&#xff0c;报“没有那个文件或目录”&#xff0c;但是文件确实存在&#xff0c;环境配置也检查过了没问题&#xff0c;本文记…...

蓝桥杯之c++入门(六)【string(practice)】

目录 练习1&#xff1a;标题统计方法1&#xff1a;一次性读取整行字符&#xff0c;然后统计方法2&#xff1a;按照单词读取小提示&#xff1a; 练习2&#xff1a;石头剪子布练习3&#xff1a;密码翻译练习4&#xff1a;文字处理软件练习5&#xff1a;单词的长度练习6&#xff1…...

go的sync包学习

包含了sync.Mutex,sync.RWMutex,sync.Cond,sync.Map,sync.Once等demo sync.Mutex //讲解mutex import ("fmt""math/rand""sync""time" )type Toilet struct {m sync.Mutex } type Person struct {Name string }var DateTime "2…...

互联网上常见的,ip地址泛播什么意思

互联网上常见的&#xff0c;ip地址泛播什么意思&#xff01; 泛播通过将IP地址广播发送到网络中的所有设备&#xff0c;使得这些设备能够接收到相关信息。例如&#xff0c;DHCP服务器在局域网中广播提供IP地址的请求&#xff0c;以便新设备能够获取一个可用的IP地址。此外&…...

Linux/C高级(精讲)----shell结构语句、shell数组

shell脚本 功能性语句 test 可测试对象三种&#xff1a;字符串 整数 文件属性 每种测试对象都有若干测试操作符 1&#xff09;字符串的测试&#xff1a; s1 s2 测试两个字符串的内容是否完全一样 s1 ! s2 测试两个字符串的内容是否有差异 -z s1 测试s1 字符串的长度是…...

14.kafka开机自启动配置

要在Linux(RHEL7.7)系统中设置kafka开机自启动&#xff0c;可以创建一个系统服务单元文件。以下是为详细配置部署&#xff0c;假设你已经安装了kafka并且可以通过kafka-server-start.sh命令启动它。 1.进入/lib/systemd/system目录 命令&#xff1a; cd /lib/systemd/system…...

Fix | Resolving ImportError: libGL.so.1 Missing in Docker/Local Environments

1. 遇到libGL.so.1缺失报错怎么办&#xff1f; 最近在部署一个基于OpenGL的图形处理项目时&#xff0c;又双叒叕遇到了这个熟悉的报错&#xff1a;"ImportError: libGL.so.1: cannot open shared object file: No such file or directory"。这已经是这个月第三次碰到…...

别再看水刊了!智能故障诊断领域投稿,这20+个SCI期刊才是你的目标(附避坑指南)

智能故障诊断领域投稿指南&#xff1a;20高价值SCI期刊与避坑策略 对于从事智能故障诊断研究的学者而言&#xff0c;选择合适的SCI期刊投稿是研究成果获得认可的关键一步。本文将系统梳理该领域的优质期刊资源&#xff0c;帮助您避开常见陷阱&#xff0c;提高投稿成功率。 1. 智…...

杨立昆新模型杀疯了,1500万参数单GPU就能碾压大厂?

就在前几天&#xff0c;AI教父、图灵奖得主杨立昆刚发了个新模型&#xff0c;名叫LeWorldModel&#xff0c;论文一发出&#xff0c;整个圈子瞬间炸锅。说出来你们可能都不信——这货只有1500万参数&#xff0c;单块GPU几个小时就能训完&#xff0c;随便一个研究者都拉起来跑一遍…...

2026权威评测:TOP5毕业论文AIGC降重方案对比与首选建议

全景速览&#xff1a;2026盲审季TOP5降重工具核心对比表 排名工具名称降重与去痕效能核心适用场景致命短板 / 核心优势1Scholingo靠岸妙写★★★★★国内本科/硕博盲审、核心期刊投稿优势&#xff1a;DOM级自定义大纲独家AIGC物理去痕2Paperpal★★★★☆SCI/海外顶刊纯英润色…...

从原理到实践:深入理解Shellcode免杀技术及其对抗策略

Shellcode免杀技术的深度解析与对抗策略演进 在网络安全攻防对抗的永恒博弈中&#xff0c;Shellcode免杀技术始终占据着特殊地位。不同于传统的恶意软件检测规避&#xff0c;Shellcode免杀更注重代码层面的"隐形"能力&#xff0c;其核心在于让关键载荷在内存中执行时…...

ESLint-Plugin-Unicorn规则优先级设置终极指南:如何平衡代码质量和开发效率

ESLint-Plugin-Unicorn规则优先级设置终极指南&#xff1a;如何平衡代码质量和开发效率 【免费下载链接】eslint-plugin-unicorn More than 100 powerful ESLint rules 项目地址: https://gitcode.com/gh_mirrors/es/eslint-plugin-unicorn ESLint-Plugin-Unicorn是一个…...

霜儿-汉服-造相Z-Turbo作品集:看看AI能生成多美的汉服少女图

霜儿-汉服-造相Z-Turbo作品集&#xff1a;看看AI能生成多美的汉服少女图 1. 惊艳开篇&#xff1a;AI汉服艺术的魅力 当传统汉服遇上现代AI技术&#xff0c;会碰撞出怎样的火花&#xff1f;霜儿-汉服-造相Z-Turbo给出了令人惊叹的答案。这个基于Xinference部署的文生图模型服务…...

高性能无线基带FPGA实现:开源802.11 WiFi实时信号处理架构解析

高性能无线基带FPGA实现&#xff1a;开源802.11 WiFi实时信号处理架构解析 【免费下载链接】openwifi open-source IEEE 802.11 WiFi baseband FPGA (chip) design: driver, software 项目地址: https://gitcode.com/gh_mirrors/op/openwifi Openwifi是一个基于软件定义…...

iOSDeviceSupport:解决设备调试兼容性问题的高效管理工具

iOSDeviceSupport&#xff1a;解决设备调试兼容性问题的高效管理工具 【免费下载链接】iOSDeviceSupport All versions of iOS Device Support 项目地址: https://gitcode.com/gh_mirrors/ios/iOSDeviceSupport 问题场景&#xff1a;当新系统遇见旧Xcode "连接失败…...

图片转PDF超简单!4个实用方法轻松搞定,新手一看就会的教程

在数字化办公场景中&#xff0c;图片转PDF几乎是必备的基础技能。无论是整理会议照片、整理证件扫描件&#xff0c;还是压缩文件传输&#xff0c;将多张图片合并为PDF都能大幅提升效率。本文为你介绍4种免费无损的图片转PDF方法&#xff0c;涵盖不同使用场景和操作需求&#xf…...