文章首发于先知社区:CTF Pyjail 沙箱逃逸绕过合集 - 先知社区
承接上一篇CTF Pyjail 沙箱逃逸原理合集,本文主要来谈谈绕过手法,Pyjail 绕过过滤的手法千奇百怪, 本文在复现经典历史赛题的基础上,针对不同的沙箱类型对绕过手法进行了分类以便建立体系化的认识。
- 绕过删除模块或方法
- 绕过基于字符串匹配的过滤
- 绕过长度限制
- 绕过命名空间限制
- 绕过多行限制
- 变量覆盖与函数篡改
- 绕过 audit hook
- 绕过 AST 沙箱
- 绕过输出限制
原文太长了,为了方便编辑和及时补充,我将各个部分进行了切分。
其他技巧
模拟 no builitins 环境
no builtins 环境和 python 交互式解析器还是有所差异, 但交互式解析器并没有提供指定命名空间的功能,因此可以自己编写一个脚本进行模拟:
def repl():
global_namespace = {}
local_namespace = {}
while True:
try:
code = input('>>> ')
try:
# Try to eval the code first.
result = eval(code, global_namespace, local_namespace)
except SyntaxError:
# If a SyntaxError occurs, this might be because the user entered a statement,
# in which case we should use exec.
exec(code, global_namespace, local_namespace)
else:
print(result)
except EOFError:
break
except Exception as e:
print(f"Error: {e}")
if __name__ == "__main__":
repl()
参考资料
PREVIOUSGolang Pongo2 SSTI