blog icon indicating copy to clipboard operation
blog copied to clipboard

Python: 执行系统命令与安全编码

Open mylamour opened this issue 7 years ago • 0 comments

因为参与到SDLChina的文档编写,恰好公司内的编程语言采用的是Python,故整理之。此文亦可在sdlchina官网看见。

python语言安全

本身要注意的有,一些危险函数,危险模块的调用,主要是系统调用。这个如果调用一定要对输入输出做好过滤,以下是代码中各种导致进行系统调用的方式。尽量避免。

  • 避免各种情况导致系统调用
  • 谨慎使用Eval
  • 数据序列化

type 1: keywords

  1. exec('import os ;os.system("ls")')
  2. eval('__import__("os").system("ls")')
  3. f'''{__import__('os').system('ls')}'''
  4. [].__class__.__mro__[-1].__subclasses__()
  5. _builtin__.open('/etc/passwd')
  6. system('ls')
  7. [].__class__.__base__.__subclasses__()[59]()._module.linecache.__dict__['o'+'s'].__dict__['sy'+'stem']('l'+'s') # only python2
  8. [].__class__.__base__.__subclasses__()[59](linecache.getlines, '/etc/password')
  9. [].__class__.__base__.__subclasses__()[59](exec, '("__import__("os").system("ls")")')

type 2: python lib

  1. subprocess.Popen('ls')
  2. os.popen('ls')
  3. importlib
  4. builtins.open('/etc/passwd')
  5. linecache.getlines('/etc/passwd')

type 3: python import

  1. __import
  2. import
  3. importlib

type 4: other

import sys
sys.modules['NB']='/Users/mour/anaconda3/lib/python3.6/os.py'
import NB
  1. base64 deocde encode
  2. pickle

Web编程

对应Web编程中安全概念在python web框架中的实现。url跳转,目录遍历,任意文件读取也需要考虑在内。针对不同的框架也需要。

Flask 安全

  • 使用Flask-Security
  • 直接生成 HTML 而不通过使用Jinja2
  • 不要在用户提交的数据上调用Markup
  • 使用 Content-Disposition: attachment 标头去避免上传html文件
  • 防止CSRF,flask本身没有实现该功能

Django 安全

可参考phithon的博客,有较多相关资料。

  • 关闭DEBUG模式
  • 关闭swagger调试
  • 妥善保存SECRET_KEY
  • 使用SecurityMiddleware
  • 设置SECURE_HSTS_SECONDS开启HSTS头,强制HTTPS访问
  • 设置SECURE_CONTENT_TYPE_NOSNIFF输出nosniff头,防止类型混淆类漏洞
  • 设置SECURE_BROWSER_XSS_FILTER输出x-xss-protection头,让浏览器强制开启XSS过滤
  • 设置SECURE_SSL_REDIRECT让HTTP的请求强制跳转到HTTPS
  • 设置SESSION_COOKIE_SECURE使Cookie为Secure,不允许在HTTP中传输
  • 设置CSRF_COOKIE_SECURE使CSRF Token Cookie设置为Secure,不允许在HTTP中传输
  • 设置CSRF_COOKIE_HTTPONLY为HTTP ONLY
  • 设置X_FRAME_OPTIONS返回X-FRAME-OPTIONS: DENY头,以防止被其他页面作为框架加载导致ClickJacking
  • 部署前运行安全性检测 django-admin.py checksecure --settings=production_settings

审计工具

安装使用方式较为简单,所以不做介绍。

引用

mylamour avatar Sep 03 '18 06:09 mylamour