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 相关文章推荐
Pyhthon中使用compileall模块编译源文件为pyc文件
Apr 28 Python
python下如何查询CS反恐精英的服务器信息
Jan 17 Python
Sanic框架Cookies操作示例
Jul 17 Python
在Python 中同一个类两个函数间变量的调用方法
Jan 31 Python
python 为什么说eval要慎用
Mar 26 Python
对Python中画图时候的线类型详解
Jul 07 Python
python异常触发及自定义异常类解析
Aug 06 Python
如何用OpenCV -python3实现视频物体追踪
Dec 04 Python
pytorch三层全连接层实现手写字母识别方式
Jan 14 Python
python上selenium的弹框操作实现
Jul 13 Python
Linux安装Python3如何和系统自带的Python2并存
Jul 23 Python
Python面向对象实现方法总结
Aug 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
用header 发送cookie的php代码
2007/03/16 PHP
php获取目录所有文件并将结果保存到数组(实例)
2013/10/25 PHP
laravel 解决groupBy时出现的错误 isn't in Group By问题
2019/10/17 PHP
jQuery EasyUI API 中文文档 - ProgressBar 进度条
2011/09/29 Javascript
jquery 笔记 事件
2011/11/02 Javascript
js数组Array sort方法使用深入分析
2013/02/21 Javascript
Extjs实现进度条的两种便捷方式
2013/09/26 Javascript
客户端js性能优化小技巧整理
2013/11/05 Javascript
解析JavaScript中点号“.”的多义性
2013/12/02 Javascript
jquery实现的一个简单进度条效果实例
2014/05/12 Javascript
JS中的THIS和WINDOW.EVENT.SRCELEMENT详解
2015/05/25 Javascript
JS实现简单路由器功能的方法
2015/05/27 Javascript
jQuery实现带滑动条的菜单效果代码
2015/08/26 Javascript
js验证框架实现代码分享
2016/05/18 Javascript
基于JS实现仿百度百家主页的轮播图效果
2017/03/06 Javascript
ExtJs的Ext.Ajax.request实现waitMsg等待提示效果
2017/06/14 Javascript
javascript基础进阶_深入剖析执行环境及作用域链
2017/09/05 Javascript
判断div滑动到底部的scroll实例代码
2017/11/15 Javascript
vue2.0 + element UI 中 el-table 数据导出Excel的方法
2018/03/02 Javascript
微信小程序云开发使用方法新手初体验
2019/05/16 Javascript
javascript实现倒计时效果
2020/02/17 Javascript
Vue 中获取当前时间并实时刷新的实现代码
2020/05/12 Javascript
详解vue中在父组件点击按钮触发子组件的事件
2020/11/13 Javascript
[34:39]Secret vs VG 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
python简单文本处理的方法
2015/07/10 Python
python用10行代码实现对黄色图片的检测功能
2015/08/10 Python
详解字典树Trie结构及其Python代码实现
2016/06/03 Python
python爬取基于m3u8协议的ts文件并合并
2019/04/26 Python
python顺序执行多个py文件的方法
2019/06/29 Python
Python操作远程服务器 paramiko模块详细介绍
2019/08/07 Python
使用python 对验证码图片进行降噪处理
2019/12/18 Python
django restframework serializer 增加自定义字段操作
2020/07/15 Python
英国女性时尚精品店:THE DRESSING ROOM
2018/05/23 全球购物
不开辟用于交换数据的临时空间,如何完成字符串的逆序
2012/12/02 面试题
揠苗助长教学反思
2014/02/04 职场文书
人事行政经理岗位职责
2014/06/18 职场文书