Pickle反序列化攻击手法详解(Python)
- 内容介绍
- 文章标签
- 相关推荐
问题描述:
Pickle
pickle反序列化比java和php的危害要大不少
因为利用起来比较容易,很轻松可以RCE
实际应用场景中经常和其它基础漏洞配合起来使用
例如ssrf写redis序列化数据后被反序列化出恶意对象等
在很多比赛或漏挖中出现的llm应用也经常和pickle相关
能够序列化的对象
Noneboolint,float,complex- 元素全部为可打包对象的
tuple、list、set和dict - 函数
- 使用
def定义的模块顶层的函数(lambda不行) - 内置函数
- 使用
- 类
- 使用
class定义在模块顶层的
- 使用
- 实例对象
__dict__属性和__getstate__()函数的返回值为可序列化对象
PS:对于不能序列化的数据会抛出PicklingError异常
opcode和Bytecode
pickle的序列化数据是一段字节流
字节流由一系列pickle opcode(直译就是操作码)组成
是一种独立的栈语言,
Python Bytecode (.pyc): 是给 PVM (Python Virtual Machine) 看的,用于通用的程序逻辑
例如:
问题描述:
Pickle
pickle反序列化比java和php的危害要大不少
因为利用起来比较容易,很轻松可以RCE
实际应用场景中经常和其它基础漏洞配合起来使用
例如ssrf写redis序列化数据后被反序列化出恶意对象等
在很多比赛或漏挖中出现的llm应用也经常和pickle相关
能够序列化的对象
Noneboolint,float,complex- 元素全部为可打包对象的
tuple、list、set和dict - 函数
- 使用
def定义的模块顶层的函数(lambda不行) - 内置函数
- 使用
- 类
- 使用
class定义在模块顶层的
- 使用
- 实例对象
__dict__属性和__getstate__()函数的返回值为可序列化对象
PS:对于不能序列化的数据会抛出PicklingError异常
opcode和Bytecode
pickle的序列化数据是一段字节流
字节流由一系列pickle opcode(直译就是操作码)组成
是一种独立的栈语言,
Python Bytecode (.pyc): 是给 PVM (Python Virtual Machine) 看的,用于通用的程序逻辑
例如:

