Python 模板引擎的注入问题分析

发布时间 - 2026-01-10 22:15:04    点击率:

这几年比较火的一个漏洞就是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)
'<built-in function system>'

会先把 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  # 模板注入  # 模板引擎  # python模板引擎  # Python实现的简单模板引擎功能示例  # Python的Flask框架标配模板引擎Jinja2的使用教程  # 深入解析Python的Tornado框架中内置的模板引擎  # 为Python的Tornado框架配置使用Jinja2模板引擎的方法  # Python的Flask框架中的Jinja2模板引擎学习教程  # Python Web开发模板引擎优缺点总结  # 如何用python写个模板引擎  # 还可以  # 尤其是  # 那就  # 还不  # 很可能  # 还需要  # 回了  # 先把  # 这几年  # 转换为  # 中就  # 一个普通  # 就可以  # 最原始  # 而返  # 也就是说  # library  # html  # payload  # functions 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何实现数据库事务?(DB Facade示例)  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  googleplay官方入口在哪里_Google Play官方商店快速入口指南  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  如何在不使用负向后查找的情况下匹配特定条件前的换行符  php485函数参数是什么意思_php485各参数详细说明【介绍】  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  Laravel如何配置任务调度?(Cron Job示例)  详解vue.js组件化开发实践  大型企业网站制作流程,做网站需要注册公司吗?  如何快速搭建高效简练网站?  如何在香港服务器上快速搭建免备案网站?  js实现点击每个li节点,都弹出其文本值及修改  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  如何用AWS免费套餐快速搭建高效网站?  Laravel如何为API编写文档_Laravel API文档生成与维护方法  iOS验证手机号的正则表达式  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  高性能网站服务器配置指南:安全稳定与高效建站核心方案  laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法  如何在万网开始建站?分步指南解析  零服务器AI建站解决方案:快速部署与云端平台低成本实践  Laravel如何处理文件下载请求?(Response示例)  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  如何用PHP工具快速搭建高效网站?  JavaScript Ajax实现异步通信  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  Linux系统运维自动化项目教程_Ansible批量管理实战  如何为不同团队 ID 动态生成多个“认领值班”按钮  魔方云NAT建站如何实现端口转发?  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  Android实现代码画虚线边框背景效果  JavaScript如何实现音频处理_Web Audio API如何工作?  如何快速搭建个人网站并优化SEO?  进行网站优化必须要坚持的四大原则  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  如何实现javascript表单验证_正则表达式有哪些实用技巧  制作公司内部网站有哪些,内网如何建网站?  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  canvas 画布在主流浏览器中的尺寸限制详细介绍  济南网站建设制作公司,室内设计网站一般都有哪些功能?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  三星网站视频制作教程下载,三星w23网页如何全屏?  Laravel Session怎么存储_Laravel Session驱动配置详解  Laravel怎么实现验证码(Captcha)功能