python模板注入_Python 模板引擎的注入问题分析

这几年比较火的一个漏洞就是jinjia2之类的模板引擎的注入,通过注入模板引擎的一些特定的指令格式,比如 {{1+1}} 而返回了 2 得知漏洞存在。实际类似的问题在Python原生字符串中就存在,尤其是Python 3.6新增 f 字符串后,虽然利用还不明确,但是应该引起注意。

最原始的 %

userdata = {"user" : "jdoe", "password" : "secret" }

passwd = raw_input("Password: ")

if passwd != userdata["password"]:

print ("Password " + passwd + " is wrong for user %(user)s") % userdata

如果用户输入 %(password)s 那就可以获取用户的真实密码了。

format方法相关

https://docs.python.org/3/library/functions.html#format

除了上面的payload改写为 print (“Password ” + passwd + ” is wrong for user {user}”).format(**userdata) 之外,还可以

>>> import os

>>> '{0.system}'.format(os)

''

会先把 0 替换为 format 中的参数,然后继续获取相关的属性。

但是貌似只能获取属性,不能执行方法?但是也可以获取一些敏感信息了。

例子: http://lucumr.pocoo.org/2016/12/29/careful-with-str-format/

CONFIG = {

'SECRET_KEY': 'super secret key'

}

class Event(object):

def __init__(self, id, level, message):

self.id = id

self.level = level

self.message = message

def format_event(format_string, event):

return format_string.format(event=event)

如果 format_string 为 {event.__init__.__globals__[CONFIG][SECRET_KEY]} 就可以泄露敏感信息。

Python 3.6中的 f 字符串

这个字符串非常厉害,和Javascript ES6中的模板字符串类似,有了获取当前context下变量的能力。

https://docs.python.org/3/reference/lexical_analysis.html#f-strings

>>> a = "Hello"

>>> b = f"{a} World"

>>> b

'Hello World'

而且不仅仅限制为属性了,代码可以执行了。

>>> import os

>>> f"{os.system('ls')}"

bin etc lib media proc run srv tmp var

dev home linuxrc mnt root sbin sys usr

'0'

>>> f"{(lambda x: x - 10)(100)}"

'90'

但是貌似 没有 把一个普通字符串转换为 f 字符串的方法,也就是说用户很可能无法控制一个 f 字符串,可能无法利用,还需要继续查一下。

您可能感兴趣的文章:Python的Flask框架标配模板引擎Jinja2的使用教程深入解析Python的Tornado框架中内置的模板引擎为Python的Tornado框架配置使用Jinja2模板引擎的方法Python的Flask框架中的Jinja2模板引擎学习教程Python Web开发模板引擎优缺点总结python Django模板的使用方法(图文)基于python实现微信模板消息常用python编程模板汇总Python的Django框架中模板碎片缓存简介Python实现的简单模板引擎功能示例

  • 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、付费专栏及课程。

余额充值