cryptohack wp (CRYPTO ON THE WEB篇)(持续更新)

发布时间 2023-05-25 01:49:24作者: Cryglz

Token Appreciation

import jwt

jwt_token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmbGFnIjoiY3J5cHRve2p3dF9jb250ZW50c19jYW5fYmVfZWFzaWx5X3ZpZXdlZH0iLCJ1c2VyIjoiQ3J5cHRvIE1jSGFjayIsImV4cCI6MjAwNTAzMzQ5M30.shKSmZfgGVvd2OSB2CGezzJ3N6WAULo3w9zCl_T47KQ"

decoded_jwt = jwt.decode(jwt_token, options={"verify_signature": False})

print(decoded_jwt)

JWT Sessions


浏览器用于将JWT发送到服务器的HTTP头名称可能因应用程序的实现方式而异。然而,最常用的名称是“Authorization”。

在大多数情况下,头将采用以下格式:

Authorization: Bearer
其中是JWT令牌本身,而“Bearer”关键字指示该令牌是一个承载令牌,或者说是一种授权任何拥有者的令牌。
所以flag就是:authorization

No Way JOSE


进入一个API交互页面:
根据代码,先试试admin:
当把这一串token传上去,显示:
并没有flag。。。。试着去解码以下他:

JWT由3部分组成:标头(Header)、有效载荷(Payload)和签名(Signature)。在传输的时候,会将JWT的3部分分别进行Base64编码后用.进行连接形成最终传输的字符串:
JWTString = Base64(Header).Base64(Payload).HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
将admin:的值改为true:
得到:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiYWRtaW4iOnRydWV9.CxKAPL3ryUMNCisd3UUDFzI8UtMugBH-luvnO8zwxck,但是,这还不行,因为仅修改了有效负载部分,JOSE 标头仍表示算法为HS256. 然而,由于 JWT 只是 Base64url 编码的,我们可以创建我们自己的 JOSE 标头,利用“none”算法绕过。

import base64

JOSE_header = '{"typ":"JWT","alg":"none"}'

JOSE_bytes = JOSE_header.encode('ascii')
base64_bytes = base64.b64encode(JOSE_bytes)
JOSE_header_encoded = base64_bytes.decode('ascii')

print(JOSE_header_encoded)

得到:eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0=,=可以忽略,然后我们得到一个完整的token
eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJ1c2VybmFtZSI6ImFkbWluIiwiYWRtaW4iOnRydWV9.CxKAPL3ryUMNCisd3UUDFzI8UtMugBH-luvnO8zwxck
提交后: