python安全性_关于python安全性的问题
收集总结了一下python安全方面的知识点以及近年来的相关漏洞,如果有需要修正或补充的地方,欢迎各位师傅的指出。
常见web漏洞在python中的示例。
xss
python下的xss其原理跟php是一样的,django近年的例子如下:
CVE-2017-12794,此例中通过抛出异常造成xss。
sql注入
一般来说使用django自带的操作数据库api是不会造成sql注入的,如下:
不过django依然支持原生sql语法的使用方法,如下:
控制台结果如下:
如果代码如下:
访问http://127.0.0.1:8000/?user=admin后控制台返回hahaha
而访问http://127.0.0.1:8000/?user=qqq%22%20or%20%221,控制台直接返回了
代码/命令执行
除内建的模块,还有os,commands,subprocess,multiprocessing,pty,Cpickle/pickle,PyYAML等模块能代码/命令执行,详细可看下文。
CSRF
django这类的框架自带csrf防护,不过在去年依然爆出csrf漏洞CVE-2016-7401-Django(知道创宇这篇分析很细致),如果django使用了Google Analytics则可能绕过django自带的csrf防护机制。
Django对于CSRF的防护就是判断cookie中的csrftoken和提交的csrfmiddlewaretoken的值是否相等,但是Google Analytics可以通过referer帮我们设置用户的cookie,cookie一般如下:
其中[HOST]和[PATH]是由Referer确定的,也就是说当
时,cookie如下:
django在当时的版本有cookie解析漏洞,当Cookie.SimpleCookie()解析a=hello]b=world这样的字符串时,就会取得a=hello和b=world,所以当Referer为http://x.com/hello]csrftoken=world,csrftoken就被成功赋值。
详细的代码分析,值得一看。
文件上传
在php环境下如果不限制上传文件后缀会导致getshell,但在django下,如果上传的文件能覆盖类似url.py,__init__.py的文件,攻击者能顺利getshell。参考https://www.secpulse.com/archives/36220.html 。还有django只有在development server的模式下才会修改了文件就立刻重启,否则修改了文件也暂时无法生效。
当然除此之外还有其他方法,例如写cron(前提是有权限),和模板文件。
简单说一下写模板文件的过程:
需要在templatetags和templates分别写入一个文件(可能也不叫templatetags,可自行定义),templatetags文件夹内存放自定义标签,上传文件rce.py,代码如下:
templates文件夹存放静态html文件,上传文件home.html如下:
在view里,index会使用这个模板:
访问后,就在项目目录生成了mapl0文件。
可见使用限制很大,还需要一定的权限。首先,文件后缀没有限制,其次上传路径没有限制,templatetags目录已知,另外还需要有view使用这个模板。
另外xml和html文件的自由上传依然可以造成xxe和xss。
文件包含
相比之下文件包含比php少得多
重定向
django在今年爆出了两个重定向漏洞CVE-2017-7233&7234其中的CVE-2017-7233与urlparse有关,漏洞的说明可查看下文。
不安全模块及函数
内建函数
input():
python input() 相等于 eval(raw_input(prompt)) ,用来获取控制台的输入,在python3.0以后的版本中取消raw_input,并用input代替.
python2命令行下:
python3命令行下:
assert():
assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假。
报了个错误,但test文件已被建立
代码执行函数
eval:计算字符串中的表达式
exec:执行字符串中的语句
execfile:用来执行一个文件#python3中已无此函数
python2和python3下结果一样
eval:hello
exec:hello
execfile('temp.bin')#temp.bin内容为print('execfile:hello')
结果
execfile:hello
os模块:
os.system
os.popen#和os.system的区别在于popen会把命令的输出作为返回值
os.spawn
commands模块 :
subprocess模块 :
subprocess.Popen
subprocess.call通过子进程进行外壳注入
运行结果
nobody
root
........
multiprocessing多进程模块 :
运行结果
h e l l o
pty :
只能在linux\mac下使用的伪终端
在python2\3下均可执行命令
其他有安全问题模块及函数
codecs :
codecs作用于各种编码之间的相互转换
当b以二进制方式写入文件后,用codecs在进行读取,如果errors='replace'且编码形式为utf-8时,则对于xF5和xF4这类不能编码的都会被替换为\ufffd。
在python2下:
在Python3下会报错:
ctypes :
ctypes是一个提供和C语言兼容的数据类型的外部库,当出现x00的空字符就会出现截断
在python2命令行下:
ab
abc1234
在python3下回报错:
Python Interpreter :
对于类似if 0: if False: 的写法,python版本的不同,其测试结果也不同
可重用整数 :
对此的解释是,Python 维护了一个对象连接池,其中保有前几百个整数,重用它们会节约内存和对象的创建。
浮点数比较 :
由于固有受限精度,以及十进制与二进制小数表示所产生的差异导致的舍入错误。
无穷大 :
python支持无穷大的概念,但在python2下出现了这样的情况
python3下
builtins :
此模块在python启动后首先加载到内存,此时还没有执行任何程序员写的代码,在Python2.X版本中,内建模块被命名为__builtin__,而到了Python3.X版本中更名为builtins。
在 Python 2中, 内置对象可以通过魔法 __builtins__ 模块进行访问。
false被赋值成true,true被赋值成false
urllib2:
Python 的 urllib 库曾出过一个头注入的漏洞,CVE-2016-5699
如果请求头里出现了%0A则直接换行导致攻击者可以注入额外http头和请求方法,可在ssrf里攻击redis或者memcached。
Python2/Python3较新的版本均在出口处的putheader()函数里添加了一个检验,发现不合法URL会报一个error.
tarfile/ZipFile:
tarfile模块可以读取和写入tar文件,包括使用gzip或bz2压缩的压缩文件。
ZipFile模块提供了创建,读取,写入,附加和列出ZIP文件的函数。
TarFile.extractall使用此函数提取文件时,文件可能创建在其他路径,官方建议不要从不信任的来源提取文件。
ZipFile.extractall也有同样的问题,解压时文件可能创建在其他路径,但在2.7.4版本中,模块会试图阻止这种行为。
urlparse :
CVE-2017-7233 urllib.parse.urlparse的特殊情况曾给django造成一个url跳转漏洞。
django的is_safe_url函数可用于检测url是或否安全,但整合各函数是基于urllib.parse.urlparse的,urlparse在当scheme不等于http,path为纯数字时不能正常分割使得is_safe_url为true,从而达到bypass的目的。
例如 https:1029415385,is_safe_url会直接判断为true。
格式化字符串漏洞:
起因是python的新方法format,示例如下:
我们可以通过format将mapl0类中的属性输出出来,在这篇[paper](https://paper.seebug.org/175/)中(@phithon)就有类似的情况:
由于request.GET.get('email')也就是用户通过get传入的email参数完全可控,我们就能让request.user里的任意属性输出出来,例如{user.password}。
通过debug查看了一下request.user里的内容,其中session_key,目录,secret_key等等敏感信息都能查看,其中SECRET_KEY如果泄露,则可能配合django反序列化漏洞实现rce。
Jinja的沙盒绕过与此同理。顺便一说,在paper还提到的f修饰符很有意思,在python3.6版本会后,被f/F修饰的字符串将会被当做代码执行。
反序列化
Cpickle/pickle 反序列化:
python2 使用cPickle,python3 使用pickle,__reduce__函数会在被反序列化是执行,类似php里的\__wakeup,当我们序列化了一个带有\__reduce\__的类时,将其反序列化即可执行\__reduce\__里的代码
pickle用法类似
Django任意代码在django1.6版本前存在任意代码执行漏洞,其漏洞起因就是pickle。
在django1.6以下,session默认是采用pickle执行序列号操作,在1.6及以上版本默认采用json序列化,但还需要知道SECRET_KEY以及目标采用了signed_cookies。
掌阅iReader某站Python漏洞挖掘,通过redis写session从而反序列化getshell。
PyYAML 对象类型解析导致的命令执行问题:
python2下结果
1.py
__init__.py
__pycache__
......
python3下结果
shelve:
shelve用处是让对象持久化,但它在序列化与反序列化的过程中使用了pickle模块,因此我们可以利用shelve会调用的pickle在反序列化过程中执行代码。
一些在较新版本被弃用的函数和模块
rexec:
在python2.6后被弃用,相关文档.
bastion:
在python2.6后被弃用,相关文档.
tempfile.mktemp:
此函数自从2.3版本不推荐使用并使用mkstemp()代替,相关[文档](https://docs.python.org/3/library/tempfile.html?highlight=mktemp#tempfile.mktemp)
总结
python安全还远不止上文所述部分,随之python使用者的增多,其安全性必然也会不断地收到挑战,而我们也需要从中不断学习以应对随时袭来的威胁。
python安全性_关于python安全性的问题相关推荐
- 第一章 第一节:Python基础_认识Python
Python基础入门(全套保姆级教程) 第一章 第一节:Python基础_认识Python 1. 什么是编程 通俗易懂,编程就是用代码编写程序,编写程序有很多种办法,像c语言,javaPython语言 ...
- python重构_重构Python应用程序以简化操作
python重构 Do you want simpler Python code? You always start a project with the best intentions, a cle ...
- java python算法_用Python,Java和C ++示例解释的排序算法
java python算法 什么是排序算法? (What is a Sorting Algorithm?) Sorting algorithms are a set of instructions t ...
- excel python插件_利用 Python 插件 xlwings 读写 Excel
Python 通过 xlwings 读取 Excel 数据 去年底公司让我做设备管理,多次委婉拒绝,最终还是做了.其实我比较喜欢技术.做管理后发现现场没有停机率统计,而原始数据有,每次要自己在Exce ...
- 网络安全用python吗_使用Python进行网络安全渗透——密码攻击测试器
相关文章: 本篇将会涉及: HTTP 基本认证 对HTTP Basic认证进行密码暴力攻击测试 什么是HTTP 基本认证 HTTP基本认证(HTTP Basic Authentication)是HTT ...
- 动态照片墙 python 实现_利用python生成照片墙的示例代码
这篇文章主要介绍了利用python生成照片墙的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 PIL(Python Im ...
- python字符串_(Python基础教程之七)Python字符串操作
Python基础教程 在SublimeEditor中配置Python环境 Python代码中添加注释 Python中的变量的使用 Python中的数据类型 Python中的关键字 Python字符串操 ...
- python 字符识别_使用python进行光学字符识别入门
python 字符识别 语言模型设计 (Language Model Designing) Optical Character Recognition is the conversion of 2-D ...
- 类的继承python事例_【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸...
作者:白宁超 2016年10月10日22:36:57 摘要:继一文之后,笔者又将python官方文档认真学习下.官方给出的pythondoc入门资料包含了基本要点.本文是对文档常用核心要点进行梳理,简 ...
- 【100天精通python】Day1:python入门_初识python,搭建python环境,运行第一个python小程序
目录 专栏导读 1 初始python python 概述 python的应用领域 应用python的公司 2 搭建python 开发环境 2.1 安装python(以windows 系统为例)(1)下 ...
最新文章
- 自建git服务器连接Pycharm系列二:在centos7上搭建git服务器
- 【深度学习入门到精通系列】 深入浅出强化学习 Sarsa
- Navicat for Oracle实现连接Oracle
- 计算机组成原理 第五章【中央处理器】课后作业解析【MOOC答案】
- Oracle中5个核心Sql语句的基本构造:Select、Insert、Update、Delete和Merge
- 深度理解依赖注入(Dependence Injection)
- linux apache gzip压缩,Linux入门教程:配置Apache开启gzip压缩传输,gzip压缩
LoadModul
- MapReduce学习要点
- 用java怎么开发图片标注工具,一些好用的图片标注工具
- Ceph Cache tier配置
- 【JDF】学习和理解
- 201871010133 赵永军《面向对象程序设计(java)》第六、七周学习总结
- SAP License:SAP系统备料发货时的流程规范
- js字符与ascii码转换
- 运维工程师主要是做什么的?和网络工程师有啥区别?
- 2007-08-12 BSP 概念解析【zozo】---转至Drew的主页
- SQL语句:分组查询
- cmd 中清空当前行的快捷键
- Build file: no target in no project
- 第十一届“挑战杯”广东省大学生课外学术科技作品竞赛总结——陈文斌
热门文章
- Mock以及Mockito的使用
- Node.js(window)基础(1)——用cmd命令行访问某一文件夹下的js文件
- (转载)OC学习篇之---Foundation框架中的NSDirctionary类以及NSMutableDirctionary类
- Error generating final archive: Debug certificate expired on的解决办法
- sys.fn_dblog
- CCF201712-3 Crontab(100分)【模拟+文本处理】
- UVA11005 Cheapest Base【数学】
- HDU2000 ASCII码排序【字符串排序】
- opencv cvtColor dtype issue(error: (-215) )
- 天主教、新教、东正教