pyjail逃逸艺术
字数 1208 2025-08-29 08:30:18
Python沙箱逃逸技术详解
1. Python沙箱概述
Python沙箱是一种隔离执行环境,用于限制代码的权限,防止其访问敏感资源。沙箱通常通过以下方式实现限制:
- 禁用危险模块(如os、subprocess)
- 过滤关键字和特殊字符
- 限制函数调用
2. 沙箱逃逸核心思路
2.1 绕过模块禁用
- 动态导入:使用
__import__()函数动态加载被禁用的模块 - 反射访问:通过
getattr()或vars()访问模块属性和方法
2.2 突破函数过滤
- 内置函数利用:使用
eval()、exec()、compile()等内置函数 - 编码技术:通过Base64、十六进制等编码绕过关键字检测
- 字符串拼接:分片构造敏感字符串
2.3 内存操作
- ctypes模块:直接调用底层C函数
- cffi模块:外部函数接口,类似ctypes
3. bytes构造任意字符串技术
3.1 bytes基本用法
bytes(iterable_of_ints) # 通过可迭代的整数序列构造字节序列
- 每个整数代表一个字节值(0-255)
- 示例:
bytes([119, 104, 111, 97, 109, 105])→b'whoami'
3.2 字符与字节对应关系
| 字符 | ASCII值 |
|---|---|
| 'w' | 119 |
| 'h' | 104 |
| 'o' | 111 |
| 'a' | 97 |
| 'm' | 109 |
| 'i' | 105 |
3.3 动态构造技术
- 列表推导式:避免直接使用逗号和空格
bytes([j for i in range(len("whoami")) for j in range(256) if ...])
- 条件筛选:动态生成条件语句
"i=={i} and j=={ord(j)}" # 用于筛选特定字节
4. 黑名单绕过技术
4.1 字符串混淆技术
# 构造"__import__"
dict(_1_1i1m1p1o1r1t1_1_=1).keys()[0][::2] # 取偶数位字符
4.2 动态导入模块
# 构造"binascii"
list(dict(b_i_n_a_s_c_i_i_=1))[0][::2]
# 动态导入
eval("__import__")("binascii")
4.3 Base64解码执行
# 获取a2b_base64函数
list(dict(a_2_b1_1b_a_s_e_6_4=1))[0][::2]
# 解码并执行Base64编码的命令
vars(binascii)["a2b_base64"](encoded_cmd)
5. ctypes底层调用
5.1 系统调用原理
os.system("ls")的底层实现:
fork():创建子进程execve():在子进程中执行新程序waitpid():父进程等待子进程结束
5.2 ctypes示例代码
import ctypes
libc = ctypes.CDLL(None)
fork = libc.fork
execve = libc.execve
pid = fork()
if pid == 0: # 子进程
execve("/bin/ls", ["ls", "-l"], None)
else: # 父进程
libc.waitpid(pid, 0)
5.3 ctypes危险功能
- 直接调用系统函数(
fork,execve,socket等) - 绕过Python层面的所有限制
- 访问任意系统资源
6. 综合逃逸Payload示例
6.1 动态构造命令执行
# 构造并执行"__import__('os').system('whoami')"
exp = "__import__('os').system('whoami')"
bytes([j for i in range(len(exp)) for j in range(256) if ...]).decode()
6.2 Base64编码命令执行
# 通过binascii解码执行Base64编码的命令
vars(__import__("".join([c for c in "binascii"])))["a2b_base64"]("d2hvYW1p").decode()
7. 防御建议
- 禁用危险模块:必须禁用
ctypes、cffi等 - 严格过滤:过滤所有特殊字符和关键字
- 使用安全沙箱:如PyPy沙箱、RestrictedPython
- 最小权限原则:仅开放必要功能
8. 总结
Python沙箱逃逸的核心在于:
- 绕过字符串限制(bytes构造、混淆)
- 动态加载被禁模块(
__import__、反射) - 底层系统调用(ctypes)
- 编码解码技术(Base64)
理解这些技术有助于开发更安全的Python沙箱环境。