本文给大家主要讲述的是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 那就可以获取用户的真实密码了。
立即学习“Python免费学习笔记(深入)”;
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)
'<built-in function system>'会先把 0 替换为 format 中的参数,然后继续获取相关的属性。
但是貌似只能获取属性,不能执行方法?但是也可以获取一些敏感信息了。
例子: http://www.php.cn/
简介PHP轻论坛是一个简单易用的PHP论坛程序,适合小型社区和个人网站使用。v3.0版本是完全重构的版本,解决了之前版本中的所有已知问题,特别是MySQL保留字冲突问题。主要特点• 简单易用:简洁的界面,易于安装和使用• 响应式设计:适配各种设备,包括手机和平板• 安全可靠:避免使用MySQL保留字,防止SQL注入• 功能完善:支持分类、主题、回复、用户管理等基本功能• 易于扩展:模块化设计,便于
21
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 模板引擎的注入问题分析相关文章请关注PHP中文网!
python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号