SSTI注入漏洞和Web_python_template_injection和Easy_tornado

最近做了一道题,是buu上的easy-tornado。可把我为难坏了。因为之前并没听说过SSTI模板注入。经过了几天,查阅了大量资料,明白了一丢丢。

先说一下漏洞是怎么产生的。因为现在的服务器端框架,如python的flask,php的tp,java的spring等一般都采用成熟的的MVC的模式。而在这个MVC模式下,我们用户输入的请求会先进入Controller控制器。然后跟据根据请求的类型,发送给相应模块进行逻辑判断和数据库的存取。最后把结果返回到视图层。

洞成因就是服务端接收了用户的恶意输入以后,未经任何处理就将其作为 Web
应用模板内容的一部分,模板引擎在进行目标编译渲染的过程中,执行了用户插入的可以破坏模板的语句,因而可能导致了敏感信息泄露、代码执行、GetShell
等问题。其影响范围主要取决于模版引擎的复杂性。

那么什么叫渲染呢?先说说模板,模板是一种提供给程序员解析的语法。当服务器难道数据以后,放到模板中。让后模板中的渲染引擎会将这些数据转化为html文本返回给浏览器。这个就叫渲染。[个人理解]

模板注入,大概意思就是我们将一些有害代码通过有害请求提交给服务器,服务器把它编码为html文本返回给浏览器执行并返回值。这样我们就达到了注入的目的。

语法:

{% … %} 用来声明变量

{{ … }} 用来将表达式打印到模板输出

{# … #} 表示未包含在模板输出中的注释

在模板注入中,主要使用的是{{}} 和 {%%}
注入思路:
利用命令进行查询(类似于sql注入)如:
获取内置类型所对应的类:

> (''__class__.mor__)(注意此处是双'_')
> {}__class__.bases__
> 等等

查看子类

__subclasses__()

初始化返回值

__init__

对包含函数全局变量的字典的引用

globals__

之后还可以跟.open('我们输入的命令').read来执行我们的命令结果并输出。
返回描述对象的字符串(可以理解为打印出来)

__str__

好,下面我们来看一道题。
攻防世界:Web_python_template_injection:
打开靶机
在这里插入图片描述

我们也看不出有什么玄机。我们稍微尝试一下。访问一下flag.php

在这里插入图片描述

现在就可以猜个差不多了。像这种返回值很多都是SSTI模板注入。我们再实验一下,试一下flag={{3*2}}看看什么结果。

在这里插入图片描述
看,他说’6not find ‘说明3*2被执行了。那就证明了存在模板注入。
那我们就开始查询payload:/flag={{’‘.class}}
在这里插入图片描述
所以说这个变量的类是str。然后从这个类中找他的基类,payload:/flag={{’‘.class.mro}}
在这里插入图片描述
然后我们就可以从其中任意一个基类查找他的引用表列,payload:/flag={{’'.class.mro[2].subclasses()}}
在这里插入图片描述
再来介绍一下os模块:

os模块是Python中整理文件和目录最为常用的模块,该模块提供了非常丰富的方法用来处理文件和目录。

也就是所我们找到了引用os模块的基类就可以找到存放fllag的文件。os模块
从其中可以找到我们想要 所在的 site._Printer 类,它在列表的第七十二位所以我们构造__subclasses__()[71](我也不知道为什么是71,搞了半天没弄懂,呜呜呜)。payload:/flag={{‘’.class.mro[2].sub
classes
()[71].init.globals[‘os’].popen(‘ls’).read()}}。
在这里插入图片描述
可以看到flag是在一个名为fl4g的无后缀文件中。我们cat flag。payload:/flag={{‘’.class.mro[2].sub
classes
()[71].init.globals[‘os’].popen(‘cat fl4g’).read()}}。
出来了。
再看看buu的题:[护网杯 2018]easy_tornado:
打开靶机

在这里插入图片描述
我们挨个看:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到flag.txt中说flag在/fllllllllllllag中,welcome.txt中只有一个render。查了一下才知道:

r ender是使用js的完全编程能力来渲染页面,即用js来构建DOM.

那么就想到了ssti模板注入。hint.txt中说md5(cookie_secret+md5(filename))是获得flag的方法。
仔细观察会发现url的形式都是:/file?filename=/hints.txt&filehash=31c37b7829da13445b849896c8a10517
filename我们知道是/fllllllllllllag问题是怎么找cookie_secret。查阅资料后,我知道了cookie_secret可以在浏览器中设置cookie。但是Cookie并不安全,客户端可以轻松修改。如果你需要设置Cookie,例如,识别当前登录的用户,则需要对cookie签名以防止伪造。Tornado支持使用set_secure_cookie和get_secure_cookie方法签名的cookie。 要使用这些方法,您需要在创建应用程序时指定名为cookie_secret的密钥。

在tornado模板中,存在一些可以访问的快速对象,这里用到的是handler.settings,handler指向RequestHandler,而RequestHandler.settings又指向self.application.settings,所以handler.settings就指向RequestHandler.application.settings了,这里面就是我们的一些环境变量

所以我们尝试注入。先试验一下:我们改变filehash的值,然后报错了。
在这里插入图片描述
再实验一下是否可以注入payload:error?msg={{datetime}}(在Tornado的前端页面模板中,datetime是指向python中datetime这个模块)
在这里插入图片描述
好的存在注入点,我们再次注入,payload:error?msg={{handler.settings}}
在这里插入图片描述
好的出来了我们再去哈希一下然后payload:/file?filename=/fllllllllllllag&filehash=1626467bafc734338e47716cdc66f70f
在这里插入图片描述
好的出来了。
怎么说呢,感觉好难的。这一个知识点搞了3天,感觉还是不太明白。谁理解的透彻啊,教教我啊。
最后养养眼。
请添加图片描述

请添加图片描述
参考链接:
https://www.cnblogs.com/bmjoker/p/13508538.html
http://t.csdn.cn/NW1Ur
http://t.csdn.cn/ZQtFs
等等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值