百科

python反序列化

字号+ 作者:烟消火灭网 来源:知识 2026-10-17 09:02:36 我要评论(0)

Python反序列化漏洞,说白了就是攻击者把一段精心构造的数据喂给`pickle.loads()`,然后你的服务器就沦陷了。这事儿在CTF里是老面孔,但在真实业务里照样致命——2017年某云厂商的AP

Python反序列化漏洞,反序说白了就是列化攻击者把一段精心构造的数据喂给`pickle.loads()`,然后你的反序服务器就沦陷了。这事儿在CTF里是列化老面孔,但在真实业务里照样致命——2017年某云厂商的反序API网关就栽在这上面,攻击者直接拿到了内网root权限。列化

核心问题在于pickle协议不是反序简单的数据格式。它本质上是列化栈虚拟机指令集,`loads()`执行时等于在跑一段不可信的反序字节码。你以为在解数据,列化其实在“执行程序”。反序一个简单的列化`__reduce__`就能让pickle在反序列化时调用任意函数,比如`os.system`。反序看这段:

class Exploit: def __reduce__(self): return (os.system,列化 ('cat /etc/passwd',)) payload = pickle.dumps(Exploit()) pickle.loads(payload) # 直接执行命令

更阴险的是,你根本不需要知道目标类的反序结构。只要目标环境里有`os`模块,或者任何可利用的全局符号,就能构造payload。我见过有人用`subprocess.Popen`配合`eval`,一条链子打通整个内网。

防御方最蠢的做法是试图用黑名单过滤`__reduce__`。攻击者换个魔术方法,或者嵌套几层`__getattr__`,照样绕过去。真正靠谱的方案只有三个:

第一,永远别对不可信数据用pickle。JSON它不香吗?如果非要传对象,用`jsonpickle`这种只处理纯数据类型的库。第二,如果历史包袱太重必须用pickle,至少用`HMAC`签名验证数据完整性——但密钥管理又是个坑。第三,干脆用`pickletools`预编译检查opcode,但这种静态分析总有漏网之鱼。

有个真实案例让我印象深刻。某金融公司内部系统用pickle缓存用户session,他们以为内网安全,没做任何防护。结果一个钓鱼邮件让某个员工浏览器被控,攻击者拿到内网跳板机后,直接构造了一个恶意session塞进Redis,反序列化时执行了反弹shell。整个过程不到十分钟,安全团队连日志都没来得及看。

还有个细节容易被忽略:Python的`copyreg`模块能注册自定义reduce函数,攻击者可以利用它绕过某些沙箱。我测试过,在限制`__import__`的环境里,通过`builtins`的`getattr`链照样能拿到`os.system`——只要目标环境里有`sys.modules`。

所以我的态度很明确:pickle就该被钉在耻辱柱上。如果你非要用,那就做好心理准备——你的服务器不是在等漏洞被利用,而是在等攻击者心情好。别把安全寄托在“没人会构造恶意pickle”这种幻想上。毕竟,你永远不知道哪个实习生会在生产环境写`pickle.loads(request.data)`。

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 网站编程

    网站编程

    2026-10-17 09:00

  • 心脏流血漏洞相关内容包括

    心脏流血漏洞相关内容包括

    2026-10-17 08:34

  • 关于反渗透阻垢剂 你了解多少

    关于反渗透阻垢剂 你了解多少

    2026-10-17 07:55

  • 在线电影小说

    在线电影小说

    2026-10-17 06:20

网友点评