Python原型链污染从基础到深入

news/2025/11/4 16:19:12/文章来源:https://www.cnblogs.com/rycarl/p/19190573

之前看过许多有关Python原型链污染的题,自己一道也没能做出。

于是今天下定决心好好把这个问题解决一下

1.什么是Python原型链污染?

Python原型链污染是一种通过修改对象原型链中的属性,导致程序行为偏离预期的攻击技术。其核心原理与JavaScript原型链污染类似,但实现方式因语言特性而有所差异。

  • ​原型继承特性​
    Python中每个对象通过__class__属性指向其所属类,类通过__base__属性指向父类。当访问对象属性时,若当前对象/类中未定义,会沿原型链向上查找1****4
  • ​污染条件​
    需要存在递归合并函数(如merge)且未对特殊属性过滤

接下来我们来看一个最简单的原型链污染

class Config:is_admin = Falsedef set_config(cls, key, value):setattr(cls, key, value)def get_config(cls, key):return getattr(cls, key, None)
instance=Config()
print(instance.is_admin)     #False
setattr(instance,'is_admin','True')
print(instance.is_admin)     #True

进入python的debug模式,给倒数三行打上断点。我们可以看到刚初始化的instance里面的is_admin为false

经过setattr函数后is_admin变成了true

这个就是最简单的原型链污染

接下来我们看看一段示例代码

from flask import Flask, request, jsonify
from config import Config
app = Flask(__name__)
@app.route('/update_config',</span> methods=['POST'])
def update_config():data = request.jsonfor key, value in data.items():Config.set_config(key, value)return jsonify({"status": "success", "config": data})
@app.route('/check_admin',</span> methods=['GET'])
def check_admin():is_admin = Config.get_config('is_admin')return jsonify({"is_admin": is_admin})
if __name__ == '__main__':app.run(debug=True)

如果传入恶意参数将is_admin污染为true则可以实现对管理员校验的绕过

因为没有对传入参数进行校验我们可以试图传入{"is_admin":True}

setattr()函数就会把is_admin参数污染为true

实战中我们更经常看到的是merge的合并函数

class father:secret = "hello"
class son_a(father):pass
class son_b(father):pass
def merge(src, dst):for k, v in src.items():if hasattr(dst, '__getitem__'):if dst.get(k) and type(v) == dict:merge(v, dst.get(k))else:dst[k] = velif hasattr(dst, k) and type(v) == dict:merge(v, getattr(dst, k))else:setattr(dst, k, v)
instance = son_b()
payload = {"__class__" : {"__base__" : {"secret" : "world"}}
}
print(son_a.secret)#hello
print(instance.secret)#hello
merge(payload, instance)#hello
print(son_a.secret)#world
print(instance.secret)#world

这里由于个人觉得这个函数比较绕,我们打上断点来一步一步的解析这个函数

刚进入循环时候对应的值,整个阶段我们注意下dst变量的变化

此时dst还是son_b

在经过判断语句后(进入elif分支,因为dst没有__getitem__属性)

此时我们将第二次进入merge函数

进入后:

我们发现dst变成了son_b.__class__而src则是{'base': {'secret': 'world'}}

这是因为getattr函数获取了son_b的class属性,也就是son_b.class

src则是之前的v

继续进行分支的判断,我们即将第三次进入merge函数

进入后:

和之前类似,获取了son_b的class的base属性,相当于son_b.class.__base__也就是father类

第三次循环的k和v

此时的v不是字典了,所以进入了else分支

到了setattr函数了

此时dst为father,k为secret,v为world

所以我们将father类的secret属性成功污染为了world

参考:https://www.7ntsec.cn/?p=56

https://xz.aliyun.com/news/12518

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/955804.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025 年 11 月中小企业财税合规服务权威推荐榜:专业筹划与风险防控口碑之选

2025 年 11 月中小企业财税合规服务权威推荐榜:专业筹划与风险防控口碑之选 行业背景与发展趋势 随着我国税收监管体系的不断完善和金税四期系统的全面推行,中小企业财税合规管理正面临前所未有的挑战与机遇。2025年…

2025 年 11 月财税合规平台推荐榜单:平台报送财税合规,企业财税合规,财税合规服务,专业财税合规平台公司精选指南

2025 年 11 月财税合规平台推荐榜单:平台报送财税合规,企业财税合规,财税合规服务,专业财税合规平台公司精选指南 一、行业背景与发展趋势 随着数字经济时代的深入发展,企业财税合规管理正面临前所未有的变革与挑…

11月4号到11月9号的计划安排

7点半到8点:每天早上在扇贝背单词,现在打卡天数为22天,目标是28天六级:软考:数学:政治:java:蓝桥杯:c++:07:30 - 08:00 【固话】扇贝单词 开启一天,完成打卡,目标是28天乃至更久。唤醒大脑。 08:30 - 10:0…

RCE漏洞基础以及绕过

what is RCE?目标:攻击者通过构造恶意输入或请求,绕过系统安全机制,在目标服务器或应用程序中注入并执行代码。 本质:系统未对用户输入进行充分验证或过滤,导致攻击者能将恶意代码传递到执行环境中。常见可以被利…

详细介绍:数据结构:树

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

SQL注入基础及绕过手段

SQL注入是什么 简单来说SQL注入,就是将攻击者输入的恶意代码被传到后端与SQL语句一起构造并在数据库中执行 通过不同的手段,SQL注入可以分为一下几类select * from article where artid = 1 and xxxxx; 首先我们来看…

WPF实现组件拖动(Grid)

xaml: <Window x:Class="WpfApp3Test.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/200…

关于嵌入式硬件需要了解的基础知识 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

api测试

这是一个用于测试的博客,发布后会马上删除,如果你看到这个信息,请忽略

spring-boot-actuator-Health原理

说明 在容器化部署下,如何判断服务是否健康通过 curl 127.0.0.1:8080/actuator/health检查 是否是健康状态 使用示例以sentinel为例 实现抽象类public class SentinelHealthIndicator extends AbstractHealthIndicat…

2025年广州防霉检测机构权威推荐榜单:除螨检测/除臭效果测试/输配水设备检测源头机构精选

防霉检测市场正迎来质量与技术双重升级,据行业数据显示,2025年中国防霉检测市场规模预计突破15亿元,年增长率稳定在12% 以上。 在消费品质量与安全要求日益提高的背景下,防霉检测已成为家居、建材、纺织、电子电器…

2025年钣金机箱外壳加工厂家权威推荐榜单:钣金壳体/变频器钣金壳体/钣金加工壳体源头厂家精选

在工业制造智能化转型的推动下,钣金机箱外壳加工作为装备制造的基础环节,市场需求持续增长。据2025年行业统计数据显示,中国钣金加工市场规模已突破4200亿元,年均增长率保持在12%以上。 随着新能源、通信、自动化等…

从零到一:我的开源AI商业化实战之路

今天我想分享使用三种主流开源方案实现商业变现的真实经历,希望能为正在探索AI商业化的你提供一些参考。从零到一:我的开源AI商业化实战之路 缘起:技术人的迷思 曾经,我也坚信"技术越厉害,赚钱越容易"。…

机器学习 BASEML到底是什么

from .base import baseml from .BaseClassification import Classification from .BaseRegression import Regression from .BaseCluster import Cluster from .BaseDimentionReduction import DimentionReduction__a…

体育馆游泳卡押金原路退回,安心无忧—东方仙盟 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

DesignSpark Mechanical (DSM)输入用户名密码提示在注册过程中发生错误

前言全局说明输入用户名密码提示“注册过程中发生错误”一、说明 1.1 环境: Windows 11 家庭版 24H2 26100.4061 Designspark Mechanical 6.0.3二、问题 一直可以用 DSM 都很正常,最近换了电脑,需要登录,输入用户名…

字段(辨析:字段、对象、属性和方法在 JavaScript 中的关系)

1. 对象 (Object) :名词,实体,是一个具体的实体,它是属性和方法的集合。它就是一个“东西”。 2. 属性 (Property) :形容词,状态,是描述对象状态或特征的值。它回答的是对象“是什么”或“有什么”的问题。属性…

P14364 [CSP-S 2025] 员工招聘 / employ 笔记

考完这次 CSP 真正的感受到了自己的弱小,「努力」了大半年,面对正赛题解还是跟读天书一样,什么都看不懂,文化课成绩倒是步步低降了。 我该在哪里停留?我问我自己。设最终的排列是 \(p_{1\dots n}\),\([1,i)\) 拒…

Spring boot 使用虚拟线程示例

项目使用版本Spring Boot v3.5.6 jdk 25配置 创建 VirtualThreadConfig 配置类 @Configuration @EnableAsync public class VirtualThreadConfig {@Bean(name = "virtualThreadExecutor")public TaskExecuto…

微算法科技(NASDAQ MLGO):以隐私计算区块链筑牢多方安全计算(MPC)安全防线

在数据价值日益凸显的当下,数据的流通与融合成为释放其潜力的关键。多方安全计算(MPC)作为隐私计算的核心技术,使参与方能够在不泄露原始数据的情况下协同完成计算任务,为数据的跨主体合作利用提供了可能。然而,…