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 相关文章推荐
Mac中升级Python2.7到Python3.5步骤详解
Apr 27 Python
Python计算斗牛游戏概率算法实例分析
Sep 26 Python
Python如何实现MySQL实例初始化详解
Nov 06 Python
python爬虫获取淘宝天猫商品详细参数
Jun 23 Python
利用pyinstaller打包exe文件的基本教程
May 02 Python
python3 批量获取对应端口服务的实例
Jul 25 Python
python开头的coding设置方法
Aug 08 Python
tesserocr与pytesseract模块的使用方法解析
Aug 30 Python
python单向链表的基本实现与使用方法【定义、遍历、添加、删除、查找等】
Oct 24 Python
python filecmp.dircmp实现递归比对两个目录的方法
May 22 Python
详解Python高阶函数
Aug 15 Python
mac安装python3后使用pip和pip3的区别说明
Sep 01 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实现读取一个1G的文件大小
2013/08/24 PHP
php微信支付之APP支付方法
2015/03/04 PHP
php发送短信验证码完成注册功能
2015/11/24 PHP
Laravel中错误与异常处理的用法示例
2018/09/16 PHP
javascript 三种编解码方式
2010/02/01 Javascript
ASP.NET中AJAX 调用实例代码
2012/05/03 Javascript
JavaScript高级程序设计 阅读笔记(十三) js定义类或对象
2012/08/14 Javascript
javascript的创建多行字符串的7种方法
2014/04/29 Javascript
jquery制作LED 时钟特效
2015/02/01 Javascript
AngularJS基础 ng-switch 指令简单示例
2016/08/03 Javascript
详解vue过滤器在v2.0版本用法
2017/06/01 Javascript
详解为Bootstrap Modal添加拖拽的方法
2018/01/05 Javascript
vuex 项目结构目录及一些简单配置介绍
2018/04/08 Javascript
jQuery+css last-child实现选择最后一个子元素操作示例
2018/12/10 jQuery
Selenium执行Javascript脚本参数及返回值过程详解
2020/04/01 Javascript
在Uni中使用Vue的EventBus总线机制操作
2020/07/31 Javascript
vue 解决data中定义图片相对路径页面不显示的问题
2020/08/13 Javascript
[43:32]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第一场
2014/05/26 DOTA
python利用urllib和urllib2访问http的GET/POST详解
2017/09/27 Python
python数据抓取分析的示例代码(python + mongodb)
2017/12/25 Python
Python使用pandas对数据进行差分运算的方法
2018/12/22 Python
python3 selenium自动化 frame表单嵌套的切换方法
2019/08/23 Python
python3实现从kafka获取数据,并解析为json格式,写入到mysql中
2019/12/23 Python
PyTorch中的padding(边缘填充)操作方式
2020/01/03 Python
pycharm工具连接mysql数据库失败问题
2020/04/01 Python
python列表的逆序遍历实现
2020/04/20 Python
PyCharm 光标变成黑块的解决方式
2021/02/06 Python
浅析CSS3中鲜为人知的属性:-webkit-tap-highlight-color
2017/01/12 HTML / CSS
彪马土耳其官网:PUMA土耳其
2019/07/14 全球购物
旅游项目开发策划书
2014/01/18 职场文书
2015年党员个人自我评价
2015/03/03 职场文书
幼儿园中班教育随笔
2015/08/14 职场文书
2015年幼儿园师德师风建设工作总结
2015/10/23 职场文书
浅谈Redis在直播场景的实践方案
2021/04/27 Redis
Win10/Win11 任务栏替换成经典样式
2022/04/19 数码科技
vue 给数组添加新对象并赋值
2022/04/20 Vue.js