最近挖不出洞,正好和别的师傅聊到这个,水一篇。考虑一个比较小众、但可能遇到的场景:jinja2 模板可控,上了沙箱 SandboxedEnvironment,怎么快速判断有没有搞头?
两个真实的漏洞 case 是 CVE-2020-13948 和过期的 airflow rce,后者的 poc 我在下岗倒计时:gpt4 当面卷我实录的 test4 里给出来了,所以上面问题的答案也就呼之欲出:在 jinja2 上下文变量数组里找一个同时满足下面两个要求的变量
变量是 py module
它的 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,也算是殊途同归。