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


Posted in Python onJanuary 01, 2017

这几年比较火的一个漏洞就是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 相关文章推荐
python3使用tkinter实现ui界面简单实例
Jan 10 Python
Python中tell()方法的使用详解
May 24 Python
python使用xpath中遇到:到底是什么?
Jan 04 Python
python打包压缩、读取指定目录下的指定类型文件
Apr 12 Python
Python使用jsonpath-rw模块处理Json对象操作示例
Jul 31 Python
Python线上环境使用日志的及配置文件
Jul 28 Python
python实现对图片进行旋转,放缩,裁剪的功能
Aug 07 Python
Python拆分大型CSV文件代码实例
Oct 07 Python
pytorch实现focal loss的两种方式小结
Jan 02 Python
Python实现简单的猜单词
Jun 15 Python
Pandas实现DataFrame的简单运算、统计与排序
Mar 31 Python
Python安装使用Scrapy框架
Apr 12 Python
python getopt详解及简单实例
Dec 30 #Python
浅谈编码,解码,乱码的问题
Dec 30 #Python
Python实现将数据库一键导出为Excel表格的实例
Dec 30 #Python
python脚本实现数据导出excel格式的简单方法(推荐)
Dec 30 #Python
利用python生成一个导出数据库的bat脚本文件的方法
Dec 30 #Python
python实现按任意键继续执行程序
Dec 30 #Python
详解python3实现的web端json通信协议
Dec 29 #Python
You might like
微信公众平台接口开发入门示例
2014/12/24 PHP
php多进程应用场景实例详解
2019/07/22 PHP
非常不错的功能强大代码简单的管理菜单美化版
2008/07/09 Javascript
模仿JQuery.extend函数扩展自己对象的js代码
2009/12/09 Javascript
JS 屏蔽键盘不可用与鼠标右键不可用的方法
2013/11/18 Javascript
给事件响应函数传参数的四种方式小结
2013/12/05 Javascript
Ubuntu中搭建Nodejs开发环境过程分享
2014/06/01 NodeJs
Javascript 构造函数详解
2014/10/22 Javascript
jQuery对指定元素中指定字符串进行替换的方法
2015/03/17 Javascript
JS实现很实用的对联广告代码(可自适应高度)
2015/09/18 Javascript
基于JS实现移动端访问PC端页面时跳转到对应的移动端网页
2020/12/24 Javascript
Vue.js计算属性computed与watch(5)
2016/12/09 Javascript
jQuery实现两个select控件的互移操作
2016/12/22 Javascript
vue.js删除动态绑定的radio的指定项
2017/06/02 Javascript
JavaScript实现旋转轮播图
2020/08/18 Javascript
关于vue表单提交防双/多击的例子
2019/10/31 Javascript
jQuery 实现扁平式小清新导航
2020/07/07 jQuery
antd design table更改某行数据的样式操作
2020/10/31 Javascript
Python  连接字符串(join %)
2008/09/06 Python
Python3.6正式版新特性预览
2016/12/15 Python
基于Python闭包及其作用域详解
2017/08/28 Python
Python字典循环添加一键多值的用法实例
2019/01/20 Python
解决yum对python依赖版本问题
2019/07/05 Python
Python+selenium点击网页上指定坐标的实例
2019/07/05 Python
Django框架HttpResponse对象用法实例分析
2019/11/01 Python
python3 中使用urllib问题以及urllib详解
2020/08/03 Python
利用python为PostgreSQL的表自动添加分区
2021/01/18 Python
生物技术毕业生自荐信
2013/10/23 职场文书
公司部门司机岗位职责
2014/01/03 职场文书
金融保险专业求职信
2014/09/03 职场文书
机关作风建设剖析材料
2014/10/11 职场文书
Html分层的box-shadow效果的示例代码
2021/03/30 HTML / CSS
Nginx服务器如何设置url链接
2021/03/31 Servers
详解Python自动化之文件自动化处理
2021/06/21 Python
CSS的calc函数用法小结
2022/06/25 HTML / CSS
VMware虚拟机安装 Windows Server 2022的详细图文教程
2022/09/23 Servers