当前位置:首页>python>Python对象模型解析:攻击链与利用基础

Python对象模型解析:攻击链与利用基础

  • 2026-10-11 08:09:18
Python对象模型解析:攻击链与利用基础
点击蓝字 关注我们

在传统安全视角聚焦于显式漏洞时

一种被称为“类污染”的攻击手法

正沿着对象的内置属性链悄然蔓延

本文从_class_回溯类到

利用_globals_篡改全局命名空间

揭秘如何绕过常规防御

通过合法的属性访问链实现“类污染”

最终达成远程代码执行(RCE)

揭示Python对象模型中被忽视的安全盲区

1
Python世界的基本法则:万物皆对象,对象皆可溯

在Python的世界里,整数、字符串、函数,乃至“ 类 ”本身,都是对象。

每个对象都内置了一个属性:_class_

python

class Employee:
    company = "DefaultCorp"
emp = Employee()
print(type(emp))                # <class '__main__.Employee'>
print(emp.__class__)            # <class '__main__.Employee'>
print(emp.__class__.__base__)   # <class 'object'>

这意味着,从一个简单的实例(比如一个员工对象emp)出发,我们就能通过emp._class_回溯到它的类(Employee),甚至可以继续向上通过 _base_或 _bases_ 追溯到其父类,从而触及整个继承体系。

2

属性查找机制

在访问 emp.company 时,其属性查找机制遵循以下顺序:

 查找实例自身:检查 emp._dict_字典

查找所属类:若未找到,则搜索其类(Employee)的 _dict_

沿继承链向上:若仍无果,则遵循方法解析顺序(MRO),在父类链中逐级查找

⚠️风险由此浮现:

类属性被所有实例共享

在上述链条中,类属性处于一个共享的、全局的位置。因此,修改一个类属性(例如 Employee.company =“New Corp”),会立即影响所有没有定义同名实例属性的该类的实例。

这是Python面向对象设计中一个基础且强大的特性,它既方便了共享状态的维护,也要求在修改时需谨慎评估其影响范围。

3
攻击“ 跳板 ”:
关键的特殊属性

类污染攻击依赖于一系列特殊属性,它们是攻击链中的关键跳板:

4
攻击链全景

结合上述原理,一条完整的攻击路径清晰呈现如下:

1. 起点:攻击者控制或能够访问某个Python对象实例。

2. 定位类:通过实例_class_找到其所属的类。

3. 遍历继承树:通过_bases_向上或_subclasses_()向下遍历,寻找包含有用(或危险)子类的类。

4. 跳向函数空间:在找到的目标子类中,通过目标子类._init_访问到这个函数对象。

5. 夺取控制权:通过目标子类._init_._globals_获取该函数所在模块的全局命名空间字典。攻击者可在此字典中修改或插入键值,例如覆盖 _builtins_ 或植入恶意函数,最终实现任意代码执行(RCE)。

这个过程,本质上是对Python对象模型和属性解析机制的一种滥用。攻击者不需要直接调用危险函数,而是通过合法的属性访问链,“借道”抵达最终目标。

Python类继承链与 JavaScript 原型链的

结构对比

 Python类继承链
JavaScript 原型链

instance -> _class_ ->

Class -> _base_

(父类) -> 

object

obj -> _proto_  ->

Constructor.prototype ->

Object.prototype

-> null

5
总 结
  • 攻击本质:隐蔽的“借道”渗透

这是一种区别于传统漏洞的新型攻击手法。攻击者无需直接调用危险函数,而是利用 Python 合法的属性访问链,沿着对象关系网“借道”抵达目标。这种对语言原生特性的滥用,使其具有极强的隐蔽性和绕过能力。

  • 对象模型:危险的“公共内存区”

Python 的属性查找遵循“实例 → 类 → 父类链(MRO)”的路径,且类属性为所有实例共享。这一设计在提供便利的同时,也将类属性变成了攻击者的“公共内存区”。一旦获得对象控制权,攻击者即可通过 _class_  回溯类定义,或通过_bases_ 横向遍历继承树,寻找高危跳板。

  • 攻击链路:从实例到 RCE 的致命跳跃

攻击通常始于对一个普通对象实例的操控:首先通过 _class_定位其类,再利用_subclasses_() 或_bases_ 遍历继承体系;随后以类中的函数对象(如 _init_ )为支点,最终通过函数对象的 _globals_属性夺取模块的全局命名空间。

至此,覆盖  _builtins_ 或植入恶意函数,实现任意代码执行(RCE)便水到渠成。

重点关注

_globals_ 属性带来的全局命名空间劫持风险:在所有攻击环节中,应特别警惕对函数对象 _globals_ 属性的访问与篡改。

这是连接对象链与代码执行的最后一道关口,一旦该属性指向的模块全局字典被污染,意味着程序的执行环境和内置功能(如open、eval)可能被完全替换,从而导致彻底的沦陷。

开发者需严格限制不可信输入对函数对象及其 _globals_ 属性的访问权限。

加入我们~获取更多安全情报快讯

以上就是本篇文章的技术细节。

其实,每次写这类分析时,我都在想

“单篇文章就像一张漏洞快照,有价值,但也相对孤立。

真正的行业敏锐度,来自于漏洞背后的持续观察;海量告警的讨论分析;以及在真实环境中无数次历练形成的直觉。”

很难通过阅读单篇文章积累。

因此,我们构建了一个

”注重实战交流“与“深度共享”的

「知识星球」社区

目前星球已聚集了[52]名安全工程师、研究员和团队负责人。

我们刻意控制规模,并设有加入门槛,只为维持聚焦、务实、互信的交流氛围。

“安全是一个对抗性极强的领域,一个人闭门造车,视角终究有限。

如果你已不满足于碎片信息,渴望在一个高质量的环境中,构建可迁移的实战知识体系,并连接一群值得信赖的同行者,这里或许适合你。

PS.:为了确保大家目标一致,请务必阅读星球置顶的《社区公约》。

这是一个为深度学习和有效连接付费的社区。


更多内容

欢迎加入「网络安全技术交流群」免费分享>>

我们专注漏洞研究、攻防实战与代码审计。

群内定期分享技术动态、实战资源与本文相关的工具资料,

让大家一起讨论、共同成长。

添加好友,备注「网络安全」获取入群邀请

更多问题1v1解答>>


点击阅读更多内容

代码审计

  1. 代码审计-PHP 篇(一)之从原理到实战的全景指南

  2. 代码审计-PHP 篇(二)之前台代码审计实战指南

  3. 代码审计-PHP 篇(三)之深度审计 SQL 注入漏洞

  4. 代码审计-PHP 篇(四)之文件操作类漏洞:深度剖析文件操作场景潜在风险

  5. 代码审计-PHP篇(五):洞悉风险,固守防线 -- 文件读取漏洞深度解析与防护

  6. 代码审计-PHP篇(六)之文件删除漏洞:从任意删除到系统瘫痪的致命威胁

代码审计(实战篇)

  1. 『PHP代码审计』· 实战篇-熊海CMS代码审计(一)

  2. 『PHP代码审计』· 实战篇-熊海CMS代码审计(二)

  3. 『PHP代码审计』· 实战篇-熊海CMS代码审计(三)

  4. 『PHP代码审计』· 实战篇-BlueCMS代码审计

  5. 『PHP代码审计』· 实战篇-DeDeCMS代码审计

  6. 『PHP代码审计』· 实战篇-XdCMS代码审计

靶场搭建

  1. 铸器为刃——靶场搭建系列篇(一)

  2. 铸器为刃——靶场搭建系列篇(二)

  3. 铸器为刃——靶场搭建系列篇(三)

  4. 铸器为刃——靶场搭建系列篇(四)

  5. 铸器为刃——靶场搭建系列篇(五)

  6. 铸器为刃——靶场搭建系列篇(六)

环境搭建

  1. 工欲善其事必先利其器—环境搭建系列之基础工具篇一

  2. 工欲善其事必先利其器—『环境搭建系列之基础工具篇二

  3. 工欲善其事必先利其器—环境搭建系列之基础工具篇三

  4. 工欲善其事必先利其器—环境搭建系列之基础工具篇四

  5. 工欲善其事必先利其器——环境搭建系列之基础工具篇(五)

  6. 工欲善其事必先利其器——环境搭建系列之基础工具篇(六)

最新文章

随机文章