Python 沙箱逃逸
字数 1132 2025-08-29 08:30:36

Python沙箱逃逸技术深度解析

前言

本文基于SCTF 2022的Pysandbox2题目,深入分析Python沙箱逃逸技术,特别是针对Flask框架中的路由处理函数的巧妙利用。

沙箱限制分析

题目中的沙箱主要设置了以下限制:

  • 禁止使用引号(单引号和双引号)
  • 禁止使用小括号

这些限制使得常规的函数调用和方法使用变得困难。

核心逃逸思路

1. 覆盖黑名单检测方法

虽然文档没有详细描述该方法,但提到可以通过覆盖黑名单检测方法来绕过限制。这是一种常见的沙箱逃逸技术,通过修改或替换沙箱的检测机制来实现逃逸。

2. Flask路由处理函数覆盖

在Flask 2.x版本中,发现可以通过覆盖url_parse函数为eval函数,然后通过路由控制实现eval的参数控制,最终绕过小括号限制实现任意命令执行。

具体利用链

  1. 首先将url_parse函数覆盖为eval函数
  2. 通过路由控制传递参数给eval
  3. 利用Flask内部处理流程中的url_parse调用点执行代码

关键发现

  • uri_to_iri函数中调用的url_parse已经被成功覆盖
  • 覆盖仅影响当前作用域中的方法,不是全局覆盖
  • 在Flask 3.x版本中,类似的利用链存在于serving.make_environ方法中

3. 利用脚本分析

文档提到使用递归脚本来查找利用链,虽然具体脚本内容未展示,但可以推测其工作原理是:

  1. 递归搜索Flask框架中所有可能调用url_parse的地方
  2. 找到可以被覆盖且最终能导致代码执行的调用链

扩展到Flask 3.x版本

在Flask 3.x中:

  • 类似的利用链位于serving.make_environ方法
  • 使用相同的覆盖技术
  • 通过路由处理实现命令执行

其他潜在利用点

除了明显的路由处理函数外,还有许多地方会对路由或其他参数进行处理,这些地方都可以成为覆盖目标。这种思路也可以应用于SSTI(服务器端模板注入)漏洞中的WAF绕过。

原型链污染技术

文档还提到了原型链污染技术:

  • 可以使用setattr方法进行设置
  • 常规情况下原型链污染不能污染为方法,因为JSON传参需要双引号
  • 如果直接构造(不使用JSON),是可以实现方法污染的

防御建议

  1. 严格限制沙箱环境中的函数覆盖能力
  2. 对路由处理函数进行保护,防止被恶意覆盖
  3. 使用最新版本的框架,并及时应用安全补丁
  4. 实施多层防御,不仅仅依赖沙箱机制

总结

这种沙箱逃逸技术展示了:

  1. 通过覆盖关键函数实现逃逸的巧妙思路
  2. 框架内部处理流程中的潜在风险点
  3. 递归查找利用链的方法论
  4. 从特定版本扩展到通用技术的思维方式

这种技术不仅适用于CTF比赛,也对现实中的安全防护有重要启示意义。

Python沙箱逃逸技术深度解析 前言 本文基于SCTF 2022的Pysandbox2题目,深入分析Python沙箱逃逸技术,特别是针对Flask框架中的路由处理函数的巧妙利用。 沙箱限制分析 题目中的沙箱主要设置了以下限制: 禁止使用引号(单引号和双引号) 禁止使用小括号 这些限制使得常规的函数调用和方法使用变得困难。 核心逃逸思路 1. 覆盖黑名单检测方法 虽然文档没有详细描述该方法,但提到可以通过覆盖黑名单检测方法来绕过限制。这是一种常见的沙箱逃逸技术,通过修改或替换沙箱的检测机制来实现逃逸。 2. Flask路由处理函数覆盖 在Flask 2.x版本中,发现可以通过覆盖 url_parse 函数为 eval 函数,然后通过路由控制实现 eval 的参数控制,最终绕过小括号限制实现任意命令执行。 具体利用链 首先将 url_parse 函数覆盖为 eval 函数 通过路由控制传递参数给 eval 利用Flask内部处理流程中的 url_parse 调用点执行代码 关键发现 在 uri_to_iri 函数中调用的 url_parse 已经被成功覆盖 覆盖仅影响当前作用域中的方法,不是全局覆盖 在Flask 3.x版本中,类似的利用链存在于 serving.make_environ 方法中 3. 利用脚本分析 文档提到使用递归脚本来查找利用链,虽然具体脚本内容未展示,但可以推测其工作原理是: 递归搜索Flask框架中所有可能调用 url_parse 的地方 找到可以被覆盖且最终能导致代码执行的调用链 扩展到Flask 3.x版本 在Flask 3.x中: 类似的利用链位于 serving.make_environ 方法 使用相同的覆盖技术 通过路由处理实现命令执行 其他潜在利用点 除了明显的路由处理函数外,还有许多地方会对路由或其他参数进行处理,这些地方都可以成为覆盖目标。这种思路也可以应用于SSTI(服务器端模板注入)漏洞中的WAF绕过。 原型链污染技术 文档还提到了原型链污染技术: 可以使用 setattr 方法进行设置 常规情况下原型链污染不能污染为方法,因为JSON传参需要双引号 如果直接构造(不使用JSON),是可以实现方法污染的 防御建议 严格限制沙箱环境中的函数覆盖能力 对路由处理函数进行保护,防止被恶意覆盖 使用最新版本的框架,并及时应用安全补丁 实施多层防御,不仅仅依赖沙箱机制 总结 这种沙箱逃逸技术展示了: 通过覆盖关键函数实现逃逸的巧妙思路 框架内部处理流程中的潜在风险点 递归查找利用链的方法论 从特定版本扩展到通用技术的思维方式 这种技术不仅适用于CTF比赛,也对现实中的安全防护有重要启示意义。