web入门-361
这是一个ssit漏洞注入基础题
ssit介绍:SSTI 就是服务器端模板注入( Server-Side Template Injection )
当前使用的一些框架,比如 python 的 flask , php 的 tp , java 的 spring 等一般都采用成熟的
的MVC的模式,用户的输入先进入Controller控制器,然后根据请求类型和请求的指令发送给对
应Model业务模型进行业务逻辑判断,数据库存取,最后把结果返回给View视图层,经过模板渲
染展示给用户。
漏洞成因就是服务端接收了用户的恶意输入以后,未经任何处理就将其作为 Web 应用模板内容
的一部分,模板引擎在进行目标编译渲染的过程中,执行了用户插入的可以破坏模板的语句,因
而可能导致了敏感信息泄露、代码执行、GetShell 等问题。其影响范围主要取决于模版引擎的复
杂性。
凡是使用模板的地方都可能会出现 SSTI 的问题,SSTI 不属于任何一种语言,沙盒逃逸也不是,
沙盒逃逸只是由于模板引擎发现了很大的安全漏洞,然后模板引擎设计出来的一种防护机制,不
允许使用没有定义或者声明的模块,这适用于所有的模板引擎。
开始注入:
这是jinja2模板
这里使用到了__class__、base、subclasses()三种魔术方法,用处大概就是获取类,获取基类,获取所有类
后面便是寻找我们要利用的函数,寻找那些有回显的或者可以执行命令的类
大多数利用的是 os._wrap_close 这个类
我第一次还是纯手工找的(╯°□°)╯︵ ┻━┻
利用脚本寻找:
with open(r".\test.txt", "r") as input_file:
ssti_class = input_file.read().split(",")
print("ssti_class 内容:", ssti_class)
target = "os._wrap_close"
index = -1
for i in range(len(ssti_class)):
if target in ssti_class[i].strip():
index = i
break
if index != -1:
print(f"目标值 '{target}' 的下标为 {index}, 对应值是: {ssti_class[index].strip()}")
else:
print(f"未找到目标值 '{target}'")
找到下标
进行rce
其中用到魔术方法:
init 方法进行初始化类
globals 获取到方法内以字典的形式返回的方法、属性等
获得flag
这题展现了ssit最最基础的注入形式