首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python 反序列化浅析

声明 文章首发于跳跳糖社区https://tttang.com/archive/1782/ 前言 之前所接触的大多是PHP 反序列化题型,最近遇见了一道Python pickle反序列化类型题,因此学习了一下其反序列化...Python 对象结构的二进制序列化和反序列化。...函数执行,这就要提到opcode,也就是那序列化后的那些字符,它们都有一定的含义,我们也可以通过编写opcode实现函数执行, 具体的大家可以看这里 https://github.com/python...dir(sys.modules['secret'])) 成功找到关键词key,但发现这里是列表的形式(pickle不支持列表索引) 所以这里的话我们可以用函数reversed()将列表反序,然后用next...反序列化时对于opcode构造函数执行感到十分吃力,极有可能部分分析过程出现问题,如果有问题还请各位大师傅多多指正

58060

Python】PicklePyTorch反序列化漏洞

有人说,不要轻易加载未知来源的模型,否则存在反序列化攻击的风险,本文就对此言论进行测试分析。...Pickle反序列化漏洞 通常情况下,会用到Pickle来将一些变量/对象转换成字节串进行存储,此操作称为序列化。 读取pkl文件,还原其中的数据,此操作称为反序列化。...而在Python中,有一个天然的魔法方法__reduce__,它在进行反序列化中,会自动执行其下的内容,这就造成了一个可被用于攻击的漏洞。...具体的解释可参考官方文档:https://docs.python.org/3/library/pickle.html 下面看一个示例: import os import pickle class Test...PyTorch反序列化漏洞 Pytorch的模型保存和加载底层依然是用到了Pickle,因此同样存在反序列化的漏洞。

81320
您找到你想要的搜索结果了吗?
是的
没有找到

Python 反序列化漏洞学习笔记

: PHP 反序列化要求源代码中必须存在有问题的类,要求是被反序列化的对象中存在可控参数,具体可看这里 而 Python 反序列化不需要,其只要求被反序列化的字符可控即可造成 RCE,例如: # Python2..." # 将被反序列化的字符串 pickle.loads(s) # 反序列化后即可造成命令执行,因此网站对要被反序列化的字符串应该做严格限制 在 Python 中,一切皆对象,因此能使用 pickle...(使用 def 定义,lambda 函数则不可以) 定义在模块最外层的内置函数 定义在模块最外层的类 某些类实例,这些类的 __dict__ 属性值或 __getstate__() 函数的返回值可以被封存...在反序列化时自动调用 __reduce__() 方法,该方法会自动调用返回值中的函数模块并执行 例如下面存的代码: import pickle import os class Rce(object)...pass # 反序列化时会调用 __reduce__ 方法 由于 Python 反序列化时只需要被反序列化的字符串可控(而不需要源代码中存在有安全问题的类)便可造成 RCE 因此我们可以通过如下代码轻松构造

87630

Python安全之反序列化——picklecPickle

概述 Python中有两个模块可以实现对象的序列化,pickle和cPickle,区别在于cPickle是用C语言实现的,pickle是用纯python语言实现的,用法类似,cPickle的读写效率高一些...二.用法 pickle 具有两个重要的函数: 1)一个是dump(), 作用是接受一个文件句柄和一个数据对象作为参数,把数据对象以特定的格式保存到给定的文件中; 2)另一个函数是load(),作用是从文件中取出已保存的对象...但是pickle不能序列化code对象,这里简单测试一下:将要执行的代码都写到一个函数里foo(),尝试反序列化代码对象: 问题解决:从python2.6起,包含了一个可以序列化code对象的模块Marshal...由于python可以在函数当中再导入模块和定义函数,故可以将自己要执行的代码都写到一个函数foo()里: 得到payload: http://127.0.0.1:8000/?...加载的数据列入白名单,可使用官方推荐的find_class方法,使用白名单限制反序列化引入的对象 https://docs.python.org/3.7/library/pickle.html#pickle-restrict

2.9K20

python函数

python函数 本文目录 1 调用函数 2 定义函数 3 形式参数与实际参数 4 四种参数 4.1 位置参数 4.2 关键字参数 4.3 默认参数 4.4 不定长参数 5 不可变类型与可变类型的参数传递...6 返回值 7 计算多个数字之和 调用函数 Python自己就拥有很多函数,比如常用的input()和print(): name = input ("What's your name?...函数体内部的"""显示简单友好的问候"""是被称为文档字符串的注释,描述函数是做什么的;注释内容由三引号"""括起来,Python用它们来生成文档。...对于使用位置参数的函数,如果调用该函数时参数数目不对,Python会给出错误。...不可变类型与可变类型的参数传递 在Python中,数字、字符串和元组是不可变的类型,列表和字典是可变的类型。 在Python中传递参数时: 对于不可变类型,传递的是一个值的拷贝。

87520

Python函数

Python 01 代码块与笔记 函数 参数传递1 """ 参数传递包含:可更改(mutable)与不可更改(immutable)对象 在 Python 中,string tuple number...4 """ Python 使用 lambda 来创建匿名函数 1.lambda 只是一个表达式,函数体比 def 简单很多 2.lambda 的主体是一个表达式,而不是一个代码块。...Python 内置的 enumerate 枚举函数可以把一个 list 变成索引-元素对, 这样就可以在for循环中同时迭代索引和元素本身 """ # 同时引用两个变量 l = [(1, 2)...如果你打算入手或着正在学习Python,欢迎加入我们一起学习。后台回复「Python」,获取到你想要的资源。同时我们组建了一个Python技术学习群,里面大佬与小白都有,有很好的学习氛围。...推荐阅读: Python函数的介绍 给我一首歌的时间 原创不易,感谢分享

96770

Python 函数

定义函数Python 中,定义一个函数要使用 def 语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用 return 语句返回。...参数 默认参数 Python函数定义非常简单,但灵活度却非常大。...原因解释如下: Python函数在定义的时候,默认参数L的值就被计算出来了,即[],因为默认参数L也是一个变量,它指向对象[],每次调用该函数,如果改变了L的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的...=', args, 'kw =', kw 在函数调用的时候,Python解释器自动按照参数位置和参数名把对应的参数传进去。...使用 *args 和 **kw 是 Python 的习惯写法,当然也可以用其他参数名,但最好使用习惯用法。 本文参考:廖雪峰 - Python 函数

1.3K40

python 函数

自定义函数的规则: 你可以定义一个由自己想要功能的函数,以下是简单的规则: 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。 任何传入参数和自变量必须放在圆括号中间。...函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。 函数内容以冒号起始,并且缩进。 return [表达式] 结束函数,选择性地返回一个值给调用方。...def functionname( parameters ): "函数_文档字符串" function_suite return [expression] 调用函数 定义一个函数只给了函数一个名称,指定了函数里包含的参数...这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从Python提示符执行。...参数传递 在 python 中,类型属于对象,变量是没有类型的 可更改(mutable)与不可更改(immutable)对象 在 python 中,strings, tuples, 和 numbers

62710

Python函数

Python函数 函数Python里组织代码的最小单元,Python函数包含以下几个部分: 定义函数 调用函数 参数 函数的返回值 函数的嵌套 作用域 函数执行流程 递归函数 匿名函数 生成器 高阶函数...+ y) # 函数体是正常的Python语句,可以包含任意结构 return x + y # return 语句表示函数的返回值 函数是有输入(参数)和输出(返回值)的代码单元, 把输入转化为输出...比如上述程序直接改写父函数中的变量c python的闭包中如果想改写父函数的变量可以用可变容器实现,这也是python2实现的唯一方式 In [1]: def counter(): ...:...__defaults__ # 传入值之后,也不会改变函数的__default__属性 Out[7]: (None,) Python作用域、闭包、装饰器资料 Python 的闭包和装饰器 说说Python...中的闭包 - Closure Python Enclosing作用域、闭包、装饰器话聊上篇 Python Enclosing作用域、闭包、装饰器话聊下篇 函数执行流程 函数的执行过程就是压栈和出栈的过程

2.4K20

Python函数

一、函数基础 1、函数概述 认识函数 概念:在一个完整的项目中,某些功能会被反复使用。...那么会将某段代码封装成函数,当我们要使用功能的时候直接调用函数即可 本质:函数是对功能的封装 优点: ​ 简化代码结构,增加代码的复用度(重复使用的程度) ​ 如果想修改或调试某一功能时,只需修改对应的函数即可...函数函数的调用者获得的信息,可以没有参数 : 函数内容以冒号起始,并且缩进 语句 函数封装的功能 return 一般用于结束函数,并返回给函数的调用者一些信息,"表达式"即为要返回的数据。...不带表达式的return相当于返回 None 调用函数 格式:函数名(参数列表) 注意:调用函数必须在定义之后 本质:实参给形参赋值的过程 说明: 部位 解释说明 函数名 要使用某个功能函数的名字 (...(type(x)) 2、函数也是一种数据 函数也是一种数据,那么就可以用变量来保存(函数名也是一个特殊的变量) 应用:将函数作为参数传递(回调函数) def func(x, y): return

36530

Python函数

今天是节后第一天上班,也是2018新的开始,首先祝各位新年快乐,学业有成,工作顺利,一切顺顺顺 今天我们来了解python中的函数 Python函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段...1.1.Python函数定义 1.2.对象创建 在 python 中,类型属于对象,变量是没有类型的: 以上代码中,[1,2,3] 是 List 类型,"Runoob" 是 String 类型,而变量...如 fun(la),则是将 la真正的传过去,修改后fun外部的la也会受影响python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。...1.5.调用函数时的参数使用 1)必备参数 必须与函数声明时一致的顺序来传递参数。 2)关键字参数 传参数时可与函数声明的顺序不一样,因为Python解释器可以用参数名来匹配参数值。...5)匿名函数(使用lambda创建) python 使用 lambda来创建匿名函数。lambda只是一个表达式,函数体比def简单很多。lambda的主体是一个表达式,而不是一个代码块。

94990

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券