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 相关文章推荐
Python判断值是否在list或set中的性能对比分析
Apr 16 Python
Python使用time模块实现指定时间触发器示例
May 18 Python
Python实现GUI学生信息管理系统
Apr 05 Python
Django中url的反向查询的方法
Mar 14 Python
python2.7实现爬虫网页数据
May 25 Python
深入了解Python在HDA中的应用
Sep 05 Python
python 实现return返回多个值
Nov 19 Python
OpenCV Python实现拼图小游戏
Mar 23 Python
使用pyecharts1.7进行简单的可视化大全
May 17 Python
Python 跨.py文件调用自定义函数说明
Jun 01 Python
浅析Python 条件控制语句
Jul 15 Python
Python将CSV文件转化为HTML文件的操作方法
Jun 30 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
PHP的一个完美GIF等比缩放类,附带去除缩放黑背景
2014/04/01 PHP
php json转换成数组形式代码分享
2014/11/10 PHP
PHP实现XML与数据格式进行转换类实例
2015/07/29 PHP
yii2 数据库读写分离配置示例
2017/02/10 PHP
Javascript 跨域访问解决方案
2009/02/14 Javascript
javascript call方法使用说明
2010/01/11 Javascript
JS中处理与当前时间间隔的函数代码
2012/05/23 Javascript
iframe异步加载实现点击左边菜单加载右边内容实例讲解
2013/03/04 Javascript
图片img的src不变让浏览器重新加载实现方法
2013/03/29 Javascript
浅谈Javascript 执行顺序
2013/12/18 Javascript
Thinkphp模板没有解析直接原样输出的解决方法
2014/10/31 Javascript
js根据鼠标移动速度背景图片自动旋转的方法
2015/02/28 Javascript
jquery仿QQ登录账号选择下拉框效果
2016/03/22 Javascript
动态设置form表单的action属性的值的简单方法
2016/05/25 Javascript
Node.js下自定义错误类型详解
2016/10/17 Javascript
详解nodejs微信公众号开发——2.自动回复
2017/04/10 NodeJs
JavaScript实现焦点进入文本框内关闭输入法的核心代码
2017/09/20 Javascript
35个最好用的Vue开源库(史上最全)
2019/01/03 Javascript
jQuery实现高级检索功能
2019/05/28 jQuery
Vue组件间通信 Vuex的用法解析
2019/08/05 Javascript
layui 上传图片 返回图片地址的方法
2019/09/26 Javascript
JavaScript实现简单的计算器
2020/01/16 Javascript
es6函数之严格模式用法实例分析
2020/03/17 Javascript
OpenLayers3实现对地图的基本操作
2020/09/28 Javascript
Python Web框架Flask中使用百度云存储BCS实例
2015/02/08 Python
python3实现全角和半角字符转换的方法示例
2017/09/21 Python
python中urlparse模块介绍与使用示例
2017/11/19 Python
深入了解Python枚举类型的相关知识
2019/07/09 Python
一款基于css3的列表toggle特效实例教程
2015/01/04 HTML / CSS
华为旗下电子商务平台:华为商城
2016/08/06 全球购物
酒店总经理欢迎词
2014/01/08 职场文书
网络技术专业求职信
2014/05/02 职场文书
2014年学校领导班子对照检查材料
2014/09/19 职场文书
vue使用节流函数的踩坑实例指南
2021/05/20 Vue.js
django中websocket的具体使用
2022/01/22 Python
html中两种获取标签内的值的方法
2022/06/10 HTML / CSS