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有证书的加密解密实现方法
Nov 19 Python
整理Python最基本的操作字典的方法
Apr 24 Python
Python面向对象特殊成员
Apr 24 Python
Python面向对象编程基础解析(一)
Oct 26 Python
python实现Zabbix-API监控
Sep 17 Python
PyQt 图解Qt Designer工具的使用方法
Aug 06 Python
python 实现将Numpy数组保存为图像
Jan 09 Python
Pyqt5 关于流式布局和滚动条的综合使用示例代码
Mar 24 Python
Python使用pdb调试代码的技巧
May 03 Python
Python DES加密实现原理及实例解析
Jul 17 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
Nov 17 Python
用Python监控你的朋友都在浏览哪些网站?
May 27 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 microtime获取浮点的时间戳
2010/02/21 PHP
解析php DOMElement 操作xml 文档的实现代码
2013/05/10 PHP
centos 7.2下搭建LNMP环境教程
2016/11/20 PHP
Javascript的构造函数和constructor属性
2010/01/09 Javascript
JavaScript中的this关键字介绍与使用实例
2013/06/21 Javascript
解决jquery操作checkbox火狐下第二次无法勾选问题
2014/02/10 Javascript
JS循环遍历JSON数据的方法
2014/07/08 Javascript
windows8.1+iis8.5下安装node.js开发环境
2014/12/12 Javascript
手机图片预览插件photoswipe.js使用总结
2016/08/25 Javascript
JavaScript中访问id对象 属性的方式访问属性(实例代码)
2016/10/28 Javascript
jsTree使用记录实例
2016/12/01 Javascript
BootStrapTable 单选及取值的实现方法
2017/01/10 Javascript
NodeJS仿WebApi路由示例
2017/02/28 NodeJs
jQuery使用ajax_动力节点Java学院整理
2017/07/05 jQuery
Angular2 组件交互实例详解
2017/08/24 Javascript
Vuejs开发环境搭建及热更新【推荐】
2018/09/07 Javascript
Vue中用props给data赋初始值遇到的问题解决
2018/11/27 Javascript
详解从0开始搭建微信小程序(前后端)的全过程
2019/04/15 Javascript
Vue+Element实现表格编辑、删除、以及新增行的最优方法
2019/05/28 Javascript
js的Object.assign用法示例分析
2020/03/05 Javascript
使用Python-OpenCV向图片添加噪声的实现(高斯噪声、椒盐噪声)
2019/05/28 Python
解决python执行不输出系统命令弹框的问题
2019/06/24 Python
对Django的restful用法详解(自带的增删改查)
2019/08/28 Python
python实现静态服务器
2019/09/05 Python
Python ArgumentParse的subparser用法说明
2020/04/20 Python
python实现时间序列自相关图(acf)、偏自相关图(pacf)教程
2020/06/03 Python
Python应用自动化部署工具Fabric原理及使用解析
2020/11/30 Python
澳大利亚时尚前卫设计师珠宝在线:Amber Sceats
2017/10/04 全球购物
销售人员自我评价
2014/02/01 职场文书
五月的鲜花活动方案
2014/08/21 职场文书
学校党支部公开承诺书
2015/04/30 职场文书
2015年社区平安建设工作总结
2015/05/13 职场文书
高二数学教学反思
2016/02/18 职场文书
世界文化遗产导游词
2019/08/07 职场文书
python3中apply函数和lambda函数的使用详解
2022/02/28 Python
Python绘画好看的星空图
2022/03/17 Python