Python 沙箱逃逸
字数 1132 2025-08-29 08:30:36
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比赛,也对现实中的安全防护有重要启示意义。