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 yield使用方法示例
Dec 04 Python
Python自动连接ssh的方法
Mar 07 Python
Python实现选择排序
Jun 04 Python
Python使用base64模块进行二进制数据编码详解
Jan 11 Python
Django框架自定义session处理操作示例
May 27 Python
Python 字符串类型列表转换成真正列表类型过程解析
Aug 26 Python
Python中使用socks5设置全局代理的方法示例
Apr 15 Python
记一次django内存异常排查及解决方法
Aug 07 Python
Python自动化测试中yaml文件读取操作
Aug 20 Python
Python confluent kafka客户端配置kerberos认证流程详解
Oct 12 Python
python+selenium小米商城红米K40手机自动抢购的示例代码
Mar 24 Python
python分分钟绘制精美地图海报
Feb 15 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实例分享之通过递归实现删除目录下的所有文件详解
2014/05/15 PHP
ThinkPHP模板自定义标签使用方法
2014/06/26 PHP
Yii2 批量插入、更新数据实例
2017/03/15 PHP
javascript 用原型继承来实现对象系统
2010/03/22 Javascript
客户端限制只能上传jpg格式图片的js代码
2010/12/09 Javascript
Javascript图像处理思路及实现代码
2012/12/25 Javascript
javascript中数组的sort()方法的使用介绍
2013/12/18 Javascript
jQuery实现网站添加高亮突出显示效果的方法
2015/06/26 Javascript
javascript+canvas实现刮刮卡抽奖效果
2015/07/29 Javascript
基于Bootstrap实现下拉菜单项和表单导航条(两个菜单项,一个下拉菜单和登录表单导航条)
2016/07/22 Javascript
JS继承之借用构造函数继承和组合继承
2016/09/07 Javascript
JavaScript中的return布尔值的用法和原理解析
2017/08/14 Javascript
Node.js实现连接mysql数据库功能示例
2017/09/15 Javascript
基于js 各种排序方法和sort方法的区别(详解)
2018/01/03 Javascript
vue-cli中的babel配置文件.babelrc实例详解
2018/02/22 Javascript
微信小程序canvas拖拽、截图组件功能
2018/09/04 Javascript
json前后端数据交互相关代码
2018/09/19 Javascript
CountUp.js数字滚动插件使用方法详解
2019/10/17 Javascript
vue 页面跳转的实现方式
2021/01/12 Vue.js
python验证码识别教程之滑动验证码
2018/06/04 Python
浅述python中深浅拷贝原理
2018/09/18 Python
django 读取图片到页面实例
2020/03/27 Python
Python使用文件操作实现一个XX信息管理系统的示例
2020/07/02 Python
keras实现VGG16方式(预测一张图片)
2020/07/07 Python
Yahoo-PHP面试题1
2016/07/20 面试题
设置器与访问器的定义以及各自特点
2016/01/08 面试题
班级道德讲堂实施方案
2014/02/24 职场文书
农村婚庆司仪主持词
2014/03/15 职场文书
幼儿园家长寄语
2014/04/02 职场文书
学习雷锋精神演讲稿
2014/05/10 职场文书
本科生求职信
2014/06/17 职场文书
毕业生对母校寄语
2015/02/26 职场文书
务工证明怎么写
2015/06/18 职场文书
廉洁自律证明
2015/06/24 职场文书
初中思品教学反思
2016/02/20 职场文书
python中使用redis用法详解
2022/12/24 Redis