CTF Pyjail 沙箱逃逸绕过合集

 

文章首发于先知社区:CTF Pyjail 沙箱逃逸绕过合集 - 先知社区

承接上一篇CTF Pyjail 沙箱逃逸原理合集,本文主要来谈谈绕过手法,Pyjail 绕过过滤的手法千奇百怪, 本文在复现经典历史赛题的基础上,针对不同的沙箱类型对绕过手法进行了分类以便建立体系化的认识。

  1. 绕过删除模块或方法
  2. 绕过基于字符串匹配的过滤
  3. 绕过长度限制
  4. 绕过命名空间限制
  5. 绕过多行限制
  6. 变量覆盖与函数篡改
  7. 绕过 audit hook
  8. 绕过 AST 沙箱
  9. 绕过输出限制

原文太长了,为了方便编辑和及时补充,我将各个部分进行了切分。

其他技巧

模拟 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()

参考资料