jinja2 沙箱 bypass

· 2024-03-14 18:37 · 2 阅读

2024-03-14 18:37 北京

jinja2 sandbox bypass

最近挖不出洞,正好和别的师傅聊到这个,水一篇。考虑一个比较小众、但可能遇到的场景:jinja2 模板可控,上了沙箱 SandboxedEnvironment,怎么快速判断有没有搞头?

两个真实的漏洞 case 是 CVE-2020-13948 和过期的 airflow rce,后者的 poc 我在下岗倒计时:gpt4 当面卷我实录的 test4 里给出来了,所以上面问题的答案也就呼之欲出:在 jinja2 上下文变量数组里找一个同时满足下面两个要求的变量

  1. 变量是 py module

  2. 它的 import 里有类似 os、subprocess 之类的东西

比如 test4 里用的 uuid 这个 module,它的 import 就比较直观,直接引入了 os

    # uuid.py

    import os

    import platform

    import sys

    我也遇到过间接导入的情况,稍微变形下 poc 就行,大概类似下面这种情况

      "x" -> x

      # x.py

      import ...

      import c

      ...

      # c.py

      import ...

      import os

      ...

      思路和 blackhat 2020 的议题 《Room for Escape: Scribbling Outside the Lines of Template Security》一样,那次只讲了 java 和 .net,也算是殊途同归。

      阅读原文

      跳转微信打开