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的web框架中中编写日志列表的教程
Apr 30 Python
Python中的fileinput模块的简单实用示例
Jul 09 Python
python将unicode转为str的方法
Jun 21 Python
CentOS 6.5中安装Python 3.6.2的方法步骤
Dec 03 Python
基于Python中单例模式的几种实现方式及优化详解
Jan 09 Python
Pyqt实现无边框窗口拖动以及窗口大小改变
Apr 19 Python
对Python中的@classmethod用法详解
Apr 21 Python
linux环境中没有网络怎么下载python
Jul 07 Python
Pytorch学习之torch用法----比较操作(Comparison Ops)
Jun 28 Python
使用python tkinter开发一个爬取B站直播弹幕工具的实现代码
Feb 07 Python
python 算法题——快乐数的多种解法
May 27 Python
Python爬虫实战之爬取携程评论
Jun 02 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
如何批量替换相对地址为绝对地址(利用bat批处理实现)
2013/05/27 PHP
解析PHP多种序列化与反序列化的方法
2013/06/06 PHP
解析PHP汉字转换拼音的类
2013/06/18 PHP
PHP实现的sqlite数据库连接类
2014/12/12 PHP
php计算税后工资的方法
2015/07/28 PHP
初识ThinkPHP控制器
2016/04/07 PHP
ThinkPHP中获取指定日期后工作日的具体日期方法
2018/10/14 PHP
php 函数中静态变量使用的问题实例分析
2020/03/05 PHP
prototype 1.5 &amp; scriptaculous 1.6.1 学习笔记
2006/09/07 Javascript
兼容IE和FF的js脚本代码小结(比较常用)
2010/12/06 Javascript
分享几个超级震憾的图片特效
2012/01/08 Javascript
深入理解JavaScript高级之词法作用域和作用域链
2013/12/10 Javascript
浅谈Javascript中substr和substring的区别
2015/09/30 Javascript
jQuery EasyUI 布局之动态添加tabs标签页
2015/11/18 Javascript
Bootstrap3 datetimepicker控件使用实例
2016/12/13 Javascript
原生js简单实现放大镜特效
2017/05/16 Javascript
JavaScript实现一个带AI的井字棋游戏源码
2018/05/21 Javascript
node.js中express模块创建服务器和http模块客户端发请求
2019/03/06 Javascript
微信小程序基于Taro的分享图片功能实践详解
2019/07/12 Javascript
vue中template的三种写法示例
2020/10/21 Javascript
javascript实现左右缓动动画函数
2020/11/25 Javascript
JavaScript实现前端倒计时效果
2021/02/09 Javascript
[08:54]DOTA2-DPC中国联赛 正赛 Aster vs LBZS 选手采访
2021/03/11 DOTA
使用Python对Access读写操作
2017/03/30 Python
Python实现将蓝底照片转化为白底照片功能完整实例
2019/12/13 Python
如何在 Matplotlib 中更改绘图背景的实现
2020/11/26 Python
Speedo速比涛德国官方网站:世界领先的泳装品牌
2019/08/26 全球购物
什么是Deployment descriptors;都有什么类型的部署描述符
2015/07/28 面试题
RIP版本1跟版本2的区别
2013/12/30 面试题
优秀大学生推荐信范文
2013/11/28 职场文书
高中军训广播稿
2014/01/14 职场文书
英文推荐信格式范文
2014/05/09 职场文书
酒店保洁员岗位职责
2015/02/26 职场文书
画展观后感
2015/06/17 职场文书
2015年基层党建工作汇报材料
2015/06/25 职场文书
Python打包为exe详细教程
2021/05/18 Python