Ctfshow web入门 JWT篇 web345-web350 详细题解 全

这篇具有很好参考价值的文章主要介绍了Ctfshow web入门 JWT篇 web345-web350 详细题解 全。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

CTFshow JWT web345

先看题目,提示admin。

Ctfshow web入门 JWT篇 web345-web350 详细题解 全,CTFSHOW web入门 wp合集,前端,web安全

抓个包看看看。

Ctfshow web入门 JWT篇 web345-web350 详细题解 全,CTFSHOW web入门 wp合集,前端,web安全

好吧我不装了,其实我知道是JWT。直接开做。

在jwt.io转换后,发现不存在第三部分的签证,也就不需要知道密钥。

全称是JSON Web Token。
通俗地说,JWT的本质就是一个字符串,它是将用户信息保存到一个Json字符串中,然后进行编码后得到一个JWT token,并且这个JWT token带有签名信息,接收后可以校验是否被篡改,所以可以用于在各方之间安全地将信息作为Json对象传输。

JWT由3部分组成:标头(Header)、有效载荷(Payload)和签名(Signature)。在传输的时候,会将JWT的3部分分别进行Base64编码后用.进行连接形成最终传输的字符串
JWTString = Base64(Header).Base64(Payload).HMACSHA256(base64UrlEncode(header) + “.” + base64UrlEncode(payload), secret)

这里只需要注意访问的是/admin/而不是/admin因为访问/admin表示访问admin.php而访问/admin/表示访问的是admin目录下默认的index.php

base64解码之后user改成admin再编码。
eyJhbGciOiJOb25lIiwidHlwIjoiand0In0.W3siaXNzIjoiYWRtaW4iLCJpYXQiOjE2ODA1MDY0NzYsImV4cCI6MTY4MDUxMzY3NiwibmJmIjoxNjgwNTA2NDc2LCJzdWIiOiJhZG1pbiIsImp0aSI6ImQxNjI3NDRhZDZiMTk0ZDk4MmEzNjcwMTkzMmFlZTFiIn1d
//不知道为什么出不来

CTFshow JWT web346

这次有算法了。

Ctfshow web入门 JWT篇 web345-web350 详细题解 全,CTFSHOW web入门 wp合集,前端,web安全

法一:alg字段改为none,sub改为admin脚本加密。(后面一定要加点)

Ctfshow web入门 JWT篇 web345-web350 详细题解 全,CTFSHOW web入门 wp合集,前端,web安全

法二:爆破密钥。是123456

CTFshow JWT web347

题目提示弱口令。

方法一:脚本爆破。

方法二: jwt-cracker工具爆破。

用法:
kali文件夹开终端
sudo su换成root
docker run -it --rm  jwtcrack JWT字符串

获取密码为123456,在官网上面输入密码,改成admin,自动会给我们想要的jwt字符串。 //六位有点慢,快一个小时了,不爆了。

payload:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJhZG1pbiIsImlhdCI6MTY4MDUzODIxMSwiZXhwIjoxNjgwNTQ1NDExLCJuYmYiOjE2ODA1MzgyMTEsInN1YiI6ImFkbWluIiwianRpIjoiOTY2YTNhMmQyMDc2YzY5M2NmMmNjMDMyZTI2Mzc2YWQifQ.DhAEchqVrSifkRd7vHUhXG2fezIUGZq4LDyvUdhdEc0

CTFshow JWT web348

jwt-cracker工具爆破,密钥是aaab,秒出。

Ctfshow web入门 JWT篇 web345-web350 详细题解 全,CTFSHOW web入门 wp合集,前端,web安全

CTFshow JWT web349

考点:公私钥泄密之【私钥】泄密。

还是JWT,不过这次变成了安全度更高的公私钥加密。


题目自带一个附件app.js,估计是源码。

Ctfshow web入门 JWT篇 web345-web350 详细题解 全,CTFSHOW web入门 wp合集,前端,web安全

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

可以看到,题目把私钥和公钥放在了web目录,我们访问就可以直接下载,造成了私钥公钥的泄露。

Ctfshow web入门 JWT篇 web345-web350 详细题解 全,CTFSHOW web入门 wp合集,前端,web安全

Ctfshow web入门 JWT篇 web345-web350 详细题解 全,CTFSHOW web入门 wp合集,前端,web安全

有了公私钥,我们就能生成JWT签名了,这里我们选择使用NodeJs脚本来生成签名。

const jwt = require('jsonwebtoken');
const fs = require('fs');

var privateKey = fs.readFileSync(process.cwd()+'\\private.key');
// console.log(privateKey);

var token = jwt.sign({ user: 'admin' }, privateKey, { algorithm: 'RS256' });
console.log(token)

环境准备:

1、安装node,安装完之后cmd输入node查看是否安装成功。

Ctfshow web入门 JWT篇 web345-web350 详细题解 全,CTFSHOW web入门 wp合集,前端,web安全

2、从脚本代码const jwt = require('jsonwebtoken');中看出,我们需要安装jsonwebtoken(jwt)模块。安装指令如下:(指令在cmd输入)

npm install jsonwebtoken --save

Ctfshow web入门 JWT篇 web345-web350 详细题解 全,CTFSHOW web入门 wp合集,前端,web安全

也可以直接在编译器里面安装。

Ctfshow web入门 JWT篇 web345-web350 详细题解 全,CTFSHOW web入门 wp合集,前端,web安全

3、准备就绪,运行脚本却发现报错secretOrPrivateKey has a minimum key size of 2048 bits for RS256。意思是私钥最短长度要2048,这题的私钥太短了。

Ctfshow web入门 JWT篇 web345-web350 详细题解 全,CTFSHOW web入门 wp合集,前端,web安全

产生报错的原因是,JWT版本15以后不支持小密钥,要求密钥最短长度是2048。

大师傅的馊主意(能解决问题但是不提倡):修改JWT的源码

找到\node_modules\jsonwebtoken目录,选择sign.js文件。

Ctfshow web入门 JWT篇 web345-web350 详细题解 全,CTFSHOW web入门 wp合集,前端,web安全

注释130243行。防止他报错。

Ctfshow web入门 JWT篇 web345-web350 详细题解 全,CTFSHOW web入门 wp合集,前端,web安全

Ctfshow web入门 JWT篇 web345-web350 详细题解 全,CTFSHOW web入门 wp合集,前端,web安全

然后就可以成功生成了。

Ctfshow web入门 JWT篇 web345-web350 详细题解 全,CTFSHOW web入门 wp合集,前端,web安全

根据源码,咱们修改完JWT直接根目录POST就能拿到flag。

Ctfshow web入门 JWT篇 web345-web350 详细题解 全,CTFSHOW web入门 wp合集,前端,web安全

做后发现,JWT网站也支持使用公私钥伪造,要是下次私钥长度大于2048就直接用网站吧。

Ctfshow web入门 JWT篇 web345-web350 详细题解 全,CTFSHOW web入门 wp合集,前端,web安全

CTFshow JWT web350

考点:公私钥泄密之【公钥】泄密。

可以根据公钥,修改算法从 非对称算法(比如RS256) 到 对称密钥算法(HS256)
双方都使用公钥验签,顺利篡改数据
当公钥可以拿到时,如果使用对称密码,则对面使用相同的公钥进行解密
实现验签通过


开题之后界面还是一样。

Ctfshow web入门 JWT篇 web345-web350 详细题解 全,CTFSHOW web入门 wp合集,前端,web安全

拿JWT先去网站分析一下,修改点还是user,我们的目标是user=admin

Ctfshow web入门 JWT篇 web345-web350 详细题解 全,CTFSHOW web入门 wp合集,前端,web安全

还是一样,有公钥泄露。但是没有私钥泄露。

Ctfshow web入门 JWT篇 web345-web350 详细题解 全,CTFSHOW web入门 wp合集,前端,web安全

脚本如下:

const jwt = require('jsonwebtoken');
const fs = require('fs');

var privateKey = fs.readFileSync(process.cwd()+'\\public.key');
// console.log(privateKey);

var token = jwt.sign({ user: 'admin' }, privateKey, { algorithm: 'HS256' });
console.log(token)

Ctfshow web入门 JWT篇 web345-web350 详细题解 全,CTFSHOW web入门 wp合集,前端,web安全

得到flag。

Ctfshow web入门 JWT篇 web345-web350 详细题解 全,CTFSHOW web入门 wp合集,前端,web安全

题目有提供源码,简单看看。

Ctfshow web入门 JWT篇 web345-web350 详细题解 全,CTFSHOW web入门 wp合集,前端,web安全

其他不看了,就看app.js。其他如node_modules文件夹其实是Node环境,没啥好看的。

app.js

var createError = require('http-errors');  // 导入 'http-errors' 模块,用于创建 HTTP 错误
var express = require('express');  // 导入 'express' 模块,用于创建 Web 应用
var ejs = require('ejs');  // 导入 'ejs' 模块,用于渲染 HTML 模板
var path = require('path');  // 导入 'path' 模块,用于处理文件路径
var cookieParser = require('cookie-parser');  // 导入 'cookie-parser' 模块,用于解析 Cookie
var logger = require('morgan');  // 导入 'morgan' 模块,用于日志记录
var session = require('express-session');  // 导入 'express-session' 模块,用于会话管理
var FileStore = require('session-file-store')(session);  // 导入 'session-file-store' 模块,用于将会话信息存储到文件中

var indexRouter = require('./routes/index');  // 导入 './routes/index' 模块,用于处理根路由请求

var app = express();  // 创建 Express 应用的实例

// 设置会话配置
var identityKey = 'auth';  // 定义用于标识会话的键名

app.use(session({
  name: identityKey,  // 设置会话的名称
  secret: 'ctfshow_session_secret',  // 设置用于加密会话数据的密钥
  store: new FileStore(),  // 设置会话数据存储方式为 'session-file-store',即将会话信息存储到文件中
  saveUninitialized: false,  // 设置不保存未初始化的会话
  resave: false,  // 设置不重新保存会话
  cookie: {
    maxAge: 60 * 60 * 1000 // 设置会话的有效期为 1 小时(单位是毫秒)
  }
}));

// 设置视图引擎
app.set('views', path.join(__dirname, 'views'));  // 设置视图文件的路径为当前目录下的 'views' 目录
app.engine('html', require('ejs').__express);  // 使用 'ejs' 引擎渲染 HTML 模板
app.set('view engine', 'html');  // 设置视图引擎为 'html'

app.use(logger('dev'));  // 使用 'dev' 格式的日志记录
app.use(express.json());  // 解析 JSON 请求体
app.use(express.urlencoded({ extended: false }));  // 解析 URL 编码请求体
app.use(cookieParser());  // 解析 Cookie
app.use(express.static(path.join(__dirname, 'public')));  // 设置静态文件目录为当前目录下的 'public' 目录

app.use('/', indexRouter);  // 使用导入的路由模块来处理根路由请求

// 捕获 404 错误并转发到错误处理中间件
app.use(function(req, res, next) {
  next(createError(404));  // 创建 404 错误,并转发给下一个中间件或错误处理中间件
});

// 错误处理中间件
app.use(function(err, req, res, next) {
  // 设置本地变量,仅在开发环境中提供错误信息
  res.locals.message = err.message;  // 错误消息
  res.locals.error = req.app.get('env') === 'development' ? err : {};  // 判断是否为开发环境,若是则提供错误对象

  // 渲染错误页面,返回错误状态码或默认 500 状态码
  res.status(err.status || 500);  // 设置响应状态码为错误状态码或默认 500 状态码
  res.render('error', {msg:err.message});  // 渲染名为 'error' 的模板,传入错误消息作为参数
});

module.exports = app;  // 导出创建的 Express 应用实例

?????我怎么感觉这是NodeJs原型链污染的源码包。。。。文章来源地址https://www.toymoban.com/news/detail-646125.html

到了这里,关于Ctfshow web入门 JWT篇 web345-web350 详细题解 全的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Ctfshow web入门 XXE 模板注入篇 web373-web378 详细题解 全

    学习资料: (梭哈~) https://www.cnblogs.com/20175211lyz/p/11413335.html https://www.cnblogs.com/zhaijiahui/p/9147595.html https://www.cnblogs.com/r00tuser/p/7255939.html https://mp.weixin.qq.com/s?__biz=MzU1ODg3NTMyMQ==mid=2247489349idx=1sn=ab435be65bc6c35a21ea4bd040693d8csource=41#wechat_redirect https://security.tencent.com/index.php/blog/msg/69

    2024年02月13日
    浏览(28)
  • Ctfshow web入门 SSTI 模板注入篇 web361-web372 详细题解 全

    笔记分享 一、代码块 二、常用方法 三、SSTI-jinja2执行命令的六种方式 最后附上我的思维导图 开始做题 进去是个这玩意。非常明显的SSTI模板注入的特征。 题目有提到名字就是考点。 测试一下是jinja2模板 payload:(以下这些都可以) 开始过滤了,测试了一下过滤了数字,1和

    2024年02月13日
    浏览(28)
  • Ctfshow web入门 sqli-labs特性篇 web517-web568 详细题解 全

    这里插一句。 limit 100,1 是从第100条数据开始,读取1条数据。 limit 6 是读取前6条数据。 报错注入 绕过字符串返回长度限制。 盲注 布尔和时间都可以的。 闭合换成了 \\\" 。其他和上题一样。 ctfshow–flagpa–flag3a3– 测一下回显位 布尔盲注还是能用。不过这次我们换个方法。 它

    2024年02月15日
    浏览(35)
  • Ctfshow web入门 命令执行RCE篇 web29-web77 与 web118-web124 详细题解 全

    pregmatch 是正则匹配函数,匹配是否包含flag, if(!preg_match(\\\"/flag/i\\\", $c)) , /i 忽略大小写 可以利用system来间接执行系统命令 flag采用 f* 绕过,或者 mv fl?g.php 1.txt 修改文件名,或者 cat 反引号ls反引号 linux通配符:https://www.cnblogs.com/ysuwangqiang/p/11364173.html 多了对system和php的过滤 用

    2024年02月07日
    浏览(42)
  • ctfshow-web入门-爆破wp

    ​进入主页为登录框,随便输入信息用burp抓包,发现Authorization认证使用Base64加密传输,解密发现为刚才输入的信息 右键发送至Intruder进行爆破,使用题目给出的字典进行爆破并添加变量 添加前缀使用户名固定并用Base64加密传输,记得取消勾选url-encode,不然会转义Base64的\\\"=

    2024年02月05日
    浏览(36)
  • ctfshow-Web入门-命令执行wp

    ​简单的命令执行,使用/i模式过滤大小写flag,可以使用通配符绕过过滤。 ​比上一题多过滤system与php,可以使用其他函数来执行命令,具体可以参考PHP中常见的命令执行函数与代码执行函数_-passthru-CSDN博客 ​多过滤cat,sort,shell,\\\'.\\\',空格,\\\'\\\'\\\' ​cat,sort可用其他查询命令,如

    2024年02月05日
    浏览(66)
  • Ctfshow web入门 命令执行RCE篇 web29-web77 与 web118-web124 详细题解 持续更新中(预计8.18完成)~

    pregmatch 是正则匹配函数,匹配是否包含flag, if(!preg_match(\\\"/flag/i\\\", $c)) , /i 忽略大小写 可以利用system来间接执行系统命令 flag采用 f* 绕过,或者 mv fl?g.php 1.txt 修改文件名,或者 cat 反引号ls反引号 linux通配符:https://www.cnblogs.com/ysuwangqiang/p/11364173.html 多了对system和php的过滤 用

    2024年02月12日
    浏览(31)
  • ctfshow misc入门wp

    目录 图片篇(基础操作) misc1 misc2 misc3 misc4 图片篇(信息附加) misc5 misc6 misc7 misc8 ​misc9 misc10 misc11 misc12 ​misc13 misc14 misc15 misc16 misc17 misc18 misc19 misc20 misc21 misc22 misc23 misc41 图片篇(文件结构) misc24 misc25 misc26 misc27 misc28 misc29 misc30 ​misc31 misc32 misc33 misc34 misc35 misc36 ​misc37

    2024年02月03日
    浏览(26)
  • ctfshow愚人杯-web-wp

    鄙人不才,可惜这里只做出了4道相对简单的web题(悲) 哈哈哈,不愧是愚人杯,刚开始时脑子真没反应过来 flag就是“一个不能说的密码”,绝了,我还以为flag是“群主喜欢36d”(bushi) 题目: 可以看到url里有一个img=xxx xxx为十六编码 我们试一下用index.php转换为base64: aW

    2023年04月16日
    浏览(26)
  • CTFshow web入门---web56

    题目: 题目分析: 查看本题,发现本题为命令执行类题目,但是有一个很致命的点,那么就是他过滤了所有的字母和数字,以及一系列的符号。因此本题最值得推敲的点就是如何实现 无字母数字的命令执行 通过拜读P神的一篇文章,其中《无字母数字webshell之提高篇》讲到了

    2023年04月22日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包