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操作MySQL数据库的方法分享
May 29 Python
Python实现图像几何变换
Jul 06 Python
numpy自动生成数组详解
Dec 15 Python
python中判断文件编码的chardet(实例讲解)
Dec 21 Python
利用Python如何实现一个小说网站雏形
Nov 23 Python
Python判断一个文件夹内哪些文件是图片的实例
Dec 07 Python
python爬虫 urllib模块url编码处理详解
Aug 20 Python
Python2比较当前图片跟图库哪个图片相似的方法示例
Sep 28 Python
Django文件上传与下载(FileFlid)
Oct 06 Python
Python使用正则实现计算字符串算式
Dec 29 Python
python Tensor和Array对比分析
Jan 08 Python
pandas的resample重采样的使用
Apr 24 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/02/15 PHP
PHP巧妙利用位运算实现网站权限管理的方法
2017/03/12 PHP
Laravel 实现Controller向blade前台模板赋值的四种方式小结
2019/10/22 PHP
safari,opera嵌入iframe页面cookie读取问题解决方法
2010/06/23 Javascript
JavaScript:new 一个函数和直接调用函数的区别分析
2013/07/10 Javascript
JS可以控制样式的名称写法一览
2014/01/16 Javascript
理运用命名空间让js不产生冲突避免全局变量的泛滥
2014/06/15 Javascript
基于JS+Canves实现点击按钮水波纹效果
2016/09/15 Javascript
JS SetInterval 代码实现页面轮询
2017/08/11 Javascript
vue移动端下拉刷新和上拉加载的实现代码
2018/09/08 Javascript
基于Three.js实现360度全景图片
2018/12/30 Javascript
详解关于表格合并span-method方法的补充(表格数据由后台动态返回)
2019/05/21 Javascript
jQuery鼠标滑过横向时间轴样式(代码详解)
2019/11/01 jQuery
微信小程序实现二维码签到考勤系统
2020/01/16 Javascript
JS实现拖动模糊框特效
2020/08/25 Javascript
typescript编写微信小程序创建项目的方法
2021/01/29 Javascript
[01:38]DOTA2第二届亚洲邀请赛中国区预选赛出线战队晋级之路
2017/01/17 DOTA
Python实现的数据结构与算法之基本搜索详解
2015/04/22 Python
Python3读取zip文件信息的方法
2015/05/22 Python
Python实现JSON反序列化类对象的示例
2018/01/31 Python
python绘制直方图和密度图的实例
2019/07/08 Python
使用TensorFlow对图像进行随机旋转的实现示例
2020/01/20 Python
Python JSON常用编解码方法代码实例
2020/09/05 Python
使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)
2020/10/12 Python
AmazeUI中模态框的实现
2020/08/19 HTML / CSS
美国领先的户外服装与装备用品店:Moosejaw
2016/08/25 全球购物
Dower & Hall官网:英国小众轻奢珠宝品牌
2019/01/31 全球购物
一套Delphi的笔试题一
2016/02/14 面试题
室内拓展活动方案
2014/02/13 职场文书
道路建设实施方案
2014/03/18 职场文书
教师师德承诺书
2014/03/26 职场文书
个性婚礼策划方案
2014/05/17 职场文书
旅游活动总结
2014/08/27 职场文书
2014年连锁店圣诞节活动方案
2014/12/09 职场文书
2016年小学生寒假总结
2015/10/10 职场文书
如何书写邀请函?
2019/06/24 职场文书