python 安全编码代码审计
0x00 前言
现在一般的web开发框架安全已经做的挺好的了,比如大家常用的django,但是一些不规范的开发方式还是会导致一些常用的安全问题,下面就针对这些常用问题做一些总结。代码审计准备部分见《php代码审计》,这篇文档主要讲述各种常用错误场景,基本上都是咱们自己的开发人员犯的错误,敏感信息已经去除。
0x01 XSS
未对输入和输出做过滤,场景:
1 2 3 4 5 |
|
在代码中一搜,发现有大量地方使用,比较正确的使用方式如下:
1 2 3 4 5 6 |
|
更好的就是对输入做限制,比如说一个正则范围,输出使用正确的api或者做好过滤。
0x02 CSRF
对系统中一些重要的操作要做CSRF防护,比如登录,关机,扫描等。django 提供CSRF中间件django.middleware.csrf.CsrfViewMiddleware
,写入到settings.py的中间件即可。另外再在函数前加[email protected]_exempt修饰器。
0x03 命令注入
审计代码过程中发现了一些编写代码的不好的习惯,体现最严重的就是在命令注入方面,本来python自身的一些函数库就能完成的功能,偏偏要调用os.system
来通过shell 命令执行来完成,老实说最烦这种写代码的啦。下面举个简单的例子:
1 2 3 4 5 6 7 8 |
|
很显然这段代码是存在问题的,因为fullname
是用户可控的。正确的做法是不使用os.system
接口,改成python自有的库函数,这样就能避免命令注入。python的三种删除文件方式:
1 2 3 4 |
|
使用了上述接口之后还得注意不能穿越目录,不然整个系统都有可能被删除了。常见的存在命令执行风险的函数如下:
1 2 3 |
|
推荐使用subprocess模块,同时确保shell=True未设置,否则也是存在注入风险的。
0x04 sql注入
如果是使用django的api去操作数据库就应该不会有sql注入了,但是因为一些其他原因使用了拼接sql,就会有sql注入风险。下面贴一个有注入风险的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
像这种sql拼接就有sql注入问题,正常情况下应该使用django的数据库api,如果实在有这方面的需求,可以按照如下方式写:
1 2 3 4 5 6 7 8 9 10 |
|
直接拼接的是万万不可的,如果采用ModelInstance.objects.raw(sql,[])
,或者connection.objects.execute(sql,[])
,通过列表传进去的参数是没有注入风险的,因为django会有处理。
0x05 代码执行
一般是由于eval和pickle.loads的滥用造成的,特别是eval,大家都没有意识到这方面的问题。下面举个代码中的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
这一段代码就是就是因为eval的参数不可控,导致任意代码执行,正确的做法就是literal.eval接口。再取个pickle.loads的例子:
1 2 3 4 5 6 |
|
0x06 文件操作
文件操作主要包含任意文件下载,删除,写入,覆盖等,如果能达到写入的目的时基本上就能写一个webshell了。下面举个任意文件下载的例子:
1 2 3 4 5 6 7 8 9 10 11 |
|
这段代码就存在着任意.lic文件下载的问题,没有做好限制目录穿越,同理
0x07 文件上传
1 任意文件上传
这里主要是未限制文件大小,可能导致ddos,未限制文件后缀,导致任意文件上传,未给文件重命名,可能导致目录穿越,文件覆盖等问题。
2 xml,excel等上传
在我们的产品中经常用到xml来保存一些配置文件,同时也支持xml文件的导出导入,这样在libxml2.9以下就可能导致xxe漏洞。就拿lxml来说吧:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
这是因为在lxml中默认采用的XMLParser导致的:
1 2 3 4 |
|
关注其中两个关键参数,其中resolve_entities=True,no_network=True,
其中resolve_entities=True
会导致解析实体,no_network
会为True就导致了该利用条件比较有效,会导致一些ssrf问题,不能将数据带出。在python中xml.dom.minidom,xml.etree.ElementTree
不受影响
0x08 不安全的封装
1 eval 封装不彻底
仅仅是将__builtings__
置为空,如下方式即可绕过
1 2 3 4 5 6 7 8 9 10 11 |
|
2 执行命令接口封装不彻底
在底层封装函数没有过滤shell元字符,仅仅是限定一些命令,但是其参数未做控制.
0x0a 总结
一切输入都是不可靠的,做好严格过滤。
本文章来源于乌云知识库,此镜像为了方便大家学习研究,文章版权归乌云知识库!
python 安全编码代码审计相关推荐
- python 字符编码问题
字符编码 一.字符编码的演进 ASCII GB2312 GBK1.0 GB18030 Unicode编码:国际标准字符集,它将世界各种语言的每个字符定义一个唯一的编码,以满足跨语言.跨平台 ...
- Python字符编码详解
Python字符编码详解 转自http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html Python字符编码详解 本文简单介绍了各种常用的 ...
- python字符编码是什么_python3字符编码是什么?怎么用?
最近一直讲的是python基础方面的知识,小编一直在考虑要不要加大难度.这个问题犹豫了很久,怕一些python小白不能很好的接受知识点.但是最近小编收到不少小伙伴的强烈要求,想要学习编码这个模块的知识 ...
- Python字符串编码坑彻底详细解决 何梁
所以不同编码的str对象可以先解码(decode)成unicode 再编码(encode)成其他编码的str对象. 真正完全搞清楚Python的编码问题 我想大家经常被Python的编码问题搞的晕头转 ...
- python UnicodeEncodeError 编码错误总结
从外部写入字符串 查看python默认编码 >>>import sys >>>sys.getdefaultencoding()#'utf-8' python3 是默 ...
- 【原创】Python 源文件编码解读
以下内容源于对 PEP-0263 的翻译和解读,同时给出了一些网上网友的说法. ======== 我是分割线 ======== PEP 0263 -- Defining Python Source ...
- 关于Python的编码注释# -*- coding:utf-8 -*- 详解
一.普通解释: ...
- 深入理解Python字符编码--转
http://blog.51cto.com/9478652/2057896 不论你是有着多年经验的 Python 老司机还是刚入门 Python 不久,你一定遇到过UnicodeEncodeError ...
- 1、代码中设置编码、编辑器中设置Python的编码
1Python中文编码 1.1代码中设置编码 Python中默认的编码格式是ASCII格式,在没有修改编码格式时无法正确打印汉字,所以在读取中文的时候会报错. 解决办法为只要在文件开头加入 # -- ...
- python字符编码在哪里_快速入手Python字符编码
前言 对于很多接触python的人而言,字符的处理和语言整体的温顺可靠相比显得格外桀骜不驯难以驾驭. 文章针对Python 2.7,主要因为3对的编码已经有了很大的改善并且实际原理一样,更改一下操作命 ...
最新文章
- Android开发之策略模式初探
- 合肥学院计算机原理,合肥学院计算机组成原理实验三-20210415130709.docx-原创力文档...
- windows服务器迁到_Windows Server 2008 R2 DNS 服务器迁移方法
- caffe 图片数据的转换成lmdb和数据集均值(转)
- RTT内核对象——内核对象的派生
- 路由 RIP 协议 和 滞空路由
- ref:PHP反序列化漏洞成因及漏洞挖掘技巧与案例
- WebService之Axis2 (3):使用services.xml文件发布WebService
- Python中默认参数self的理解
- 工作的思考十:思维的高度决定设计的好坏(小菜的思维)
- USGS网站中STRM DEM数据批量下载
- 计算机服务器可以开游戏吗,想买台小服务器做个人电脑,玩游戏可以吗
- 按夏普计算机技巧,股票投资策略:怎样用夏普比率Sharpe Ratio寻找强势股
- java实现百度网盘爬虫
- C语言入门(一代小白被迫被拔苗助长)
- 7-9 剥洋葱 (15 分)
- 印象派绘画在现代艺术发展中的地位和作用
- 柔性上肢康复机器人研究中的VR技术
- Vba实现按选定类型排序标记
- 关于Sunday算法以及实现