声明 文章首发于跳跳糖社区https://tttang.com/archive/1782/ 前言 之前所接触的大多是PHP 反序列化题型,最近遇见了一道Python pickle反序列化类型题,因此学习了一下其反序列化...Python 对象结构的二进制序列化和反序列化。...函数执行,这就要提到opcode,也就是那序列化后的那些字符,它们都有一定的含义,我们也可以通过编写opcode实现函数执行, 具体的大家可以看这里 https://github.com/python...dir(sys.modules['secret'])) 成功找到关键词key,但发现这里是列表的形式(pickle不支持列表索引) 所以这里的话我们可以用函数reversed()将列表反序,然后用next...反序列化时对于opcode构造函数执行感到十分吃力,极有可能部分分析过程出现问题,如果有问题还请各位大师傅多多指正
有人说,不要轻易加载未知来源的模型,否则存在反序列化攻击的风险,本文就对此言论进行测试分析。...Pickle反序列化漏洞 通常情况下,会用到Pickle来将一些变量/对象转换成字节串进行存储,此操作称为序列化。 读取pkl文件,还原其中的数据,此操作称为反序列化。...而在Python中,有一个天然的魔法方法__reduce__,它在进行反序列化中,会自动执行其下的内容,这就造成了一个可被用于攻击的漏洞。...具体的解释可参考官方文档:https://docs.python.org/3/library/pickle.html 下面看一个示例: import os import pickle class Test...PyTorch反序列化漏洞 Pytorch的模型保存和加载底层依然是用到了Pickle,因此同样存在反序列化的漏洞。
: 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 因此我们可以通过如下代码轻松构造
https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf 序列化与反序列化 Python...最终留在栈顶的值将被作为反序列化对象返回。 stack 由 Python 的 list 实现,被用来临时存储数据、参数以及对象。...PS:我的环境是 Python 3.7.4,反序列化时获取到的 builtins 是一个 dict,所以用了两次 get,视环境进行调整吧。...那该覆盖成什么函数呢?最好是 __import__(module) 后能返回字典的函数。 只能从内置函数下手了,一个一个试吧,发现没一个能用的。...反序列化漏洞/ https://www.leavesongs.com/PENETRATION/code-breaking-2018-python-sandbox.html
概述 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
今天的题目与自定义函数的定义以及使用有关,主要是传参问题,好多朋友都问我传参不知道传什么好,其实还是代码量不够,写得多了,报错多了,就知道写什么了 题目描述 写一函数,使输入的一个字符串按反序存放,在主函数中输入输出反序后的字符串
我正在尝试在datetime64 [ns]类型的列上运行fillna.当我运行类似的东西:
test1=pd.DataFrame(np.random.randn(2,2),columns=[‘1′,’2’])
思想在python里已经变成内置函数了。...python 脚本性能或 python 调用 c 函数库。...在 python2 中使用 python3 的函数功能可参照如下代码:from __future__ import print_fuction2.3 python 函数2. 3.1 python 如何传递参数...举例:带眼镜装饰器是任意可调用的对象,本质就是函数装饰器在python中使用如此方便归因于python的函数能像普通的对象一样能作为参数传递给其他函数,可以被复制给其他变量,可以… python中父线程和子线程没有直接的管理关系...脚本性能或python调用c函数库。
banana'] sorted(fruits, key=len) ['fig', 'apple', 'cherry', 'banana', 'raspberry', 'strawberry'] 函数编程与列表推导...import add ➋ reduce(add, range(100)) ➌ 4950 sum(range(100)) ➍ 4950 filter,map,reduce,all,any 查看函数的相关信息...结果 None ('name
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函数的介绍 给我一首歌的时间 原创不易,感谢分享
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中传递参数时: 对于不可变类型,传递的是一个值的拷贝。
1.Python函数基础 2.Python函数中的参数 3.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作用域、闭包、装饰器话聊下篇 函数执行流程 函数的执行过程就是压栈和出栈的过程
定义函数 在 Python 中,定义一个函数要使用 def 语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用 return 语句返回。...参数 默认参数 Python的函数定义非常简单,但灵活度却非常大。...原因解释如下: Python函数在定义的时候,默认参数L的值就被计算出来了,即[],因为默认参数L也是一个变量,它指向对象[],每次调用该函数,如果改变了L的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的...=', args, 'kw =', kw 在函数调用的时候,Python解释器自动按照参数位置和参数名把对应的参数传进去。...使用 *args 和 **kw 是 Python 的习惯写法,当然也可以用其他参数名,但最好使用习惯用法。 本文参考:廖雪峰 - Python 函数
/usr/bin/python3 # -*- coding:utf-8 -*- name = "hui" # 解释器知道这里定义了一个函数 def say_hello(): print("hello...因为在 使用函数名 调用函数之前,必须要保证 Python 已经知道函数的存在 否则控制台会提示 NameError: name 'say_hello' is not defined (名称错误:say_hello...这个名字没有被定义) 2.4 PyCharm 的调试工具 右击 Python 文件,在弹出的菜单项选择 Debug 或 点击右上角绿色的 小虫子,就可开启调试。.../usr/bin/python3 # -*- coding:utf-8 -*- def sum_2_num(): num1 = 10 num2 = 20 result = num1.../usr/bin/python3 # -*- coding:utf-8 -*- def sum_2_num(num1, num2): result = num1 + num2
自定义函数的规则: 你可以定义一个由自己想要功能的函数,以下是简单的规则: 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。 任何传入参数和自变量必须放在圆括号中间。...函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。 函数内容以冒号起始,并且缩进。 return [表达式] 结束函数,选择性地返回一个值给调用方。...def functionname( parameters ): "函数_文档字符串" function_suite return [expression] 调用函数 定义一个函数只给了函数一个名称,指定了函数里包含的参数...这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从Python提示符执行。...参数传递 在 python 中,类型属于对象,变量是没有类型的 可更改(mutable)与不可更改(immutable)对象 在 python 中,strings, tuples, 和 numbers
今天是节后第一天上班,也是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的主体是一个表达式,而不是一个代码块。
一、函数基础 1、函数概述 认识函数 概念:在一个完整的项目中,某些功能会被反复使用。...那么会将某段代码封装成函数,当我们要使用功能的时候直接调用函数即可 本质:函数是对功能的封装 优点: 简化代码结构,增加代码的复用度(重复使用的程度) 如果想修改或调试某一功能时,只需修改对应的函数即可...函数从函数的调用者获得的信息,可以没有参数 : 函数内容以冒号起始,并且缩进 语句 函数封装的功能 return 一般用于结束函数,并返回给函数的调用者一些信息,"表达式"即为要返回的数据。...不带表达式的return相当于返回 None 调用函数 格式:函数名(参数列表) 注意:调用函数必须在定义之后 本质:实参给形参赋值的过程 说明: 部位 解释说明 函数名 要使用某个功能函数的名字 (...(type(x)) 2、函数也是一种数据 函数也是一种数据,那么就可以用变量来保存(函数名也是一个特殊的变量) 应用:将函数作为参数传递(回调函数) def func(x, y): return
概述 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。 函数能提高应用的模块性,和代码的重复利用率。 Python提供了许多内建函数,比如print()。...栗子 以下为一个简单的Python函数,它将一个字符串作为传入参数,再打印到标准显示设备上。...这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从Python提示符执行。 如下实例调用了printme()函数: #!...再次调用同一函数 ---- 按值传递参数和按引用传递参数 所有参数(自变量)在Python里都是按引用传递。 如果你在函数里修改了参数,那么在调用这个函数的函数里,原始的参数也被改变了。 例如: #!...使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。 以下实例在函数 printme() 调用时使用参数名: #!
领取专属 10元无门槛券
手把手带您无忧上云