071-Web攻防-Python安全&反序列化&代码段&资源项目等

Python-PYC-反编译文件出源码

pyc 文件是py 文件编译后生成的字节码文件(byte code),pyc 文件经过python 解释器最终会生成机器码运行。因此pyc文件是可以跨平台部署的,类似Java的.class 文件,一般py 文件改变后,都会重新生成pyc文件。

  1. 什么是 .pyc 文件?
    • .pyc 文件是 Python 编译后的字节码 文件。
    • Python 解释器会将源代码(.py 文件)编译成 .pyc 文件以加快后续执行。
    • .pyc 文件存储的是经过编译的 字节码,可以被 Python 解释器直接执行,而不需要重新编译源代码。
    • .pyc文件通常存储在pycache` 目录下,这个目录是在执行 Python 程序时自动创建的。

真题:http://pan.baidu.com/s/1jGpB8DS

安装:pip install uncompyle6

使用:uncompyle6 -o test.py test.pyc

下载:https://github.com/rocky/python-uncompyle6

image-20250702142510684

image-20250702142627852

image-20250702142739838

image-20250702143041548

Python-反序列化-调用链&魔术方法

JAVA PHP Python 语言序列化和反序列化函数:

编程语言 序列化函数/接口 反序列化函数/接口 备注
Java Serializable (接口) ObjectInputStream.readObject() Serializable 用于标记类可以被序列化
Externalizable (接口) ObjectInputStream.readUnshared() Externalizable 用于更精细的控制序列化和反序列化过程
fastjson fastjson.parseObject() fastjson 用于 JSON 格式的序列化和反序列化
jackson.ObjectMapper.writeValue() jackson.ObjectMapper.readValue() Jackson 是常用的 JSON 处理库
Gson.toJson() Gson.fromJson() Gson 用于 JSON 格式的序列化和反序列化
ObjectOutputStream.writeObject() ObjectInputStream.readObject() 标准 Java 对象序列化和反序列化接口
XMLDecoder.writeObject() XMLDecoder.readObject() 主要用于 XML 格式的序列化和反序列化
XStream.toXML() XStream.fromXML() XStream 用于 XML 格式的序列化和反序列化
PHP serialize() unserialize() PHP 内建的序列化和反序列化函数
json_encode() json_decode() json_encodejson_decode 用于 JSON 格式的序列化和反序列化
Python pickle.dump() (序列化对象到文件) pickle.load() (从文件反序列化对象) pickle 用于对象的二进制序列化
marshal.dump() marshal.load() marshal 用于 Python 内部使用,不适合跨平台
json.dump() (将对象序列化为 JSON 格式) json.load() (从 JSON 格式反序列化对象) json 用于处理 JSON 格式
PyYAML.dump() PyYAML.load() PyYAML 用于 YAML 格式的序列化和反序列化
shelve (对象持久化) shelve (对象反序列化) shelve 用于将 Python 对象存储在文件中
PIL.Image.save() (序列化图像对象) PIL.Image.open() (反序列化图像对象) PIL 用于图像数据的保存和加载
unzip() zipfile.ZipFile.read() Python 中用于压缩文件的解压操作

序列化:把类对象转化为字节流或文件

反序列化:将字节流或文件转化为类对象

pickle.dump(obj,file):将对象序列化后保存到文件

pickle.iad(file):将文件序列化内容反序列化为对象

pickle.dumps(obj):将对象序列化成字符串格式的字节流

pickle.loads(bytesobj):将字符串字节流反序列化为对象

PyYAML yaml.load()JSON ison.loads(s)
marshal
PyYAML
shelve
PIL
unzip

魔术方法:
reduce()反序列化时调用
reduce ex()反序列化时调用
setstate()反序列化时调用 用于反序列化时设置对象的状态
getstate()序列化时调用

1、序列化和反序列化演示-test.py

image-20250702144520378

2、序列化和反序列化形成-test.py

image-20250702154446573

image-20250702154615143

image-20250702154839448

__setstate__() 主要用于在对象反序列化时恢复对象的状态。它允许你控制如何将数据从反序列化格式(如文件或内存中的二进制格式)加载回对象。

3、序列化和反序列化利用-server.py pop.py

image-20250702165953719

1
gASVOwAAAAAAAACMCGJ1aWx0aW5zlIwEZXZhbJSTlIwfX19pbXBvcnRfXygnb3MnKS5zeXN0ZW0oJ2NhbGMnKZSFlFKULg==

image-20250702170230598

4、序列化和反序列化赛题-[watevrCTF-2019]Pickle store

跟上题差不多参考:watevrCTF-2019 Pickle Store

黑盒:Python反序列化特征:base64编码前面g固定(列化数据)

测试:直接提交构造的 payload 测试

Python-格式化字符串-类魔术方法引用

参考:https://xz.aliyun.com/t/3569

第一种:&操作符

第二种:string.Template

第三种:调用format方法(可控格式化字符串)

image-20250702175415350

第四种:f-Strings(可控格式化字符串)

image-20250702175554424

image-20250702175642160