首页 > 其他分享 >SSTI模版注入

SSTI模版注入

时间:2023-11-22 16:33:05浏览次数:40  
标签:__ 模版 __.__ SSTI base class 模板 注入

SSTI模版注入

模板引擎

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

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

 

漏洞成因

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

 

常见模版引擎

 

 

漏洞攻击

模板注入通过传输型如{{xxx}}的执行命令来进行,同时针对不同的模版引擎有不同的针对注入方法

如在tornado模板中,存在一些可以访问的快速对象,如**handler.settings**为tornado模板中内置的环境配置信息名称,通过handler.settings可以访问到环境配置的信息。  {{handler.settings}}

SSTI类型判断

img

根据处理返回值的不同来进行判别,如果能识别括号内表达式的即为相应引擎

 

Flask SSTI漏洞

基本思路为利用 python 中的 魔术方法 找到所需函数

  • dict:保存类实例或对象实例的属性变量键值对字典

  • class:返回调用的参数类型

  • mro:返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。

  • bases:返回类型列表

  • subclasses:返回object的子类

  • init:类的初始化方法

  • globals:函数会以字典类型返回当前位置的全部全局变量 与 func_globals 等价

Python里的继承关系:

已知继承关系

class A:pass
class B(A):pass 继承自A
class C(B):pass 继承自B
class D(B):pass 继承自B
c=C()
(c.__class__)(当前类C)

(c.__class__.__base__)(当前类C的父类B)

(c.__class__.__base__.__base__)(父类A)

(c.__class__.__base__.__base__.__base__)(object类)

(c.__class__.__base__.__subclasses__())(罗列出父类B下所有子类,即类C和类D)

print(c.__class__.__base__.__subclasses__()[1])(如果类C排在类D前面,这里就是调用父类B下的子类D,如果[1]换成[0]就是调用子类C)

{{''.class__}}的两个单引号意为任意对象,与{{().class__}}、{{"".class__}}或者{{[].class__}}之间区别只是包裹的是字符,元组还是列表,仅是返回的数据类型不同,本质无区别,如果被过滤可以互相替代

 

WAF绕过

一、{%%}绕过过滤{{}}

二、getitem()绕过[]过滤:

三、绕过下划线过滤:

1.request方法

2、使用Unicode编码

3、使用十六进制编码

4、同理有base64编码绕过

5、格式化字符串

四、绕过点过滤:

1、[]代替点

2、attr()绕过

flask常用过滤器:

length(): 获取一个序列或者字典的长度并将其返回

int(): 将值转换为int类型;

float(): 将值转换为float类型

lower(): 将字符串转换为小写

upper(): 将字符串转换为大写

reverse(): 反转字符串;

replace(value,old,new): 将value中的old替换为new

list(): 将变量转换为列表类型,

string(): 将变量转换成字符串类型

join(): 将一个序列中的参数值拼接成字符串,通常配合dict()混合绕过

attr(): 获取对象的属性

 详细:

SSTI模板注入总结-CSDN博客

CTF|有关SSTI的一切小秘密【Flask SSTI+姿势集+Tplmap大杀器】 - 知乎 (zhihu.com)

SSTI模板注入最全总结及WAF绕过(万字长文!!)-CSDN博客

标签:__,模版,__.__,SSTI,base,class,模板,注入
From: https://www.cnblogs.com/gooder-hacker/p/17849636.html

相关文章

  • [转]IoC控制反转DI依赖注入概念的理解
    1.通俗的解释,便于理解,适合于初学者,相对与定义不是很准确原文地址: SpringIoC有什么好处呢?-知乎作者:Mingqi链接:https://www.zhihu.com/question/23277575/answer/169698662来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。要了解控制反转......
  • 有趣的Java之@Autowired属性注入问题
    ......
  • 快排模版
    我打算复习下快排模版,结果怎么写都写不对,贼离谱,后来发现是自己犯了一个很弱智的错误,想取bas作为随机下边然后把a[bas]作为基准,但问题在于,我把c数组赋值给a数组这步省略成了把基准赋值给a[bas]了。。这固然是节约空间的好思路,但问题在于我此前错把一个可能被修改的量当成常量来用了......
  • 【golang】【注释模版】
    @目录写在前面注释要求package结构体方法代码逻辑注释参考资料基础/标准库/第三方库golang导航编程规范算法|面试项目写在前面相关博文个人博客首页免责声明:仅供学习交流使用!开源框架可能存在的风险和相关后果将完全由用户自行承担,本人不承担任何法律责任。注释要求统......
  • 快速排序与归并排序模版
    快速排序voidquick_sort(intq[],intl,intr){if(l>=r)return;inti=l-1,j=r+1,x=q[l+(r-l>>1)];while(i<j){doi++;while(q[i]<x);doj--;while(q[j]>x);if(i&l......
  • 高精度模版
    高精度加法vector<int>add(vector<int>&A,vector<int>&B){//654321654321vector<int>C;inttemp=0;for(inti=0;i<A.size()||i<B.size();++i){if(i<A.size())temp+=A[i];......
  • Angular 依赖注入系统里 Injection token PLATFORM_ID 的使用场景
    Angular的依赖注入系统是它的核心特性之一,它使得我们可以轻松地在应用程序的各个部分共享和管理代码。在Angular的依赖注入系统中,InjectionToken是一个特别重要的概念。InjectionToken是一个用于参数类型的标记类,它可以用来在依赖注入器中注入特定的值。在这里,我们将重点讨论......
  • Spring_2023_11_20_2 -DI 依赖注入=》构造方式的形式
    DI依赖注入=》构造方式的形式构造方法的注入,使用实体类对象进行注入Student类集合的注入(数组、List、Set、Map)<!--<bean/>等同于newStudent()通过构造方法的形式进行依赖注入constructor-arg:构造方法参数的注入标签1.index:下表,构......
  • WPF-----Microsoft.Extensions 探索 / 依赖注入(DI)
    1 对于IOC的具体介绍  Microsoft.Extensions探索/依赖注入(DI)-知乎(zhihu.com) 使用DI容器需要熟悉下面的接口与类型,Microsoft.Extensions.DependencyInjection.IServiceCollection,该接口包含了一系列Add扩展方法来添加你的服务,该接口的默认实现为Microsoft.Exte......
  • Dynamic CRM 组织服务对Word模版生成PDF文件
    目的:解决用户手动下载word模版再上传问题解决方案:组织服务直接对指定的word模版文件生成PDF文件流1.word模版必须上传到系统文档模版后:设置->模版->文档模版 2.组织调用“ExportpdfDocument”,返回PDF文件字节信息。另外实体信息需要把“注释”勾选上,否则执行代码会报错,如下:......