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怎么学好python?
Oct 07 Python
Python之日期与时间处理模块(date和datetime)
Feb 16 Python
解决使用pycharm提交代码时冲突之后文件丢失找回的方法
Aug 05 Python
用python打印菱形的实操方法和代码
Jun 25 Python
python内存监控工具memory_profiler和guppy的用法详解
Jul 29 Python
Windows下python3安装tkinter的问题及解决方法
Jan 06 Python
python判断变量是否为int、字符串、列表、元组、字典的方法详解
Feb 13 Python
python在linux环境下安装skimage的示例代码
Oct 14 Python
java字符串格式化输出实例讲解
Jan 06 Python
python实现scrapy爬虫每天定时抓取数据的示例代码
Jan 27 Python
如何使用Python实现一个简易的ORM模型
May 12 Python
Python办公自动化之教你如何用Python将任意文件转为PDF格式
Jun 28 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
一个SQL管理员的web接口
2006/10/09 PHP
php include的妙用,实现路径加密
2008/07/29 PHP
php 图片上添加透明度渐变的效果
2009/06/29 PHP
迅速确定php多维数组的深度的方法
2014/01/07 PHP
PHP中多维数组的foreach遍历示例
2014/06/13 PHP
ThinkPHP之R方法实例详解
2014/06/20 PHP
php按单词截取字符串的方法
2015/04/07 PHP
javascript 去字符串空格终极版(支持utf8)
2009/11/14 Javascript
Jquery中dialog属性小记
2010/09/03 Javascript
各浏览器对link标签onload/onreadystatechange事件支持的差异分析
2011/04/27 Javascript
仅IE不支持setTimeout/setInterval函数的第三个以上参数
2011/05/25 Javascript
Javascript表格翻页效果的具体实现
2013/10/05 Javascript
javascript中cookie对象用法实例分析
2015/01/30 Javascript
jquery实现带渐变淡入淡出并向右依次展开的多级菜单效果实例
2015/08/22 Javascript
JS截取与分割字符串常用技巧总结
2015/11/10 Javascript
AngularJS指令用法详解
2016/11/02 Javascript
vue中的模态对话框组件实现过程
2018/05/01 Javascript
js中对象和面向对象与Json介绍
2019/01/21 Javascript
Python使用minidom读写xml的方法
2015/06/03 Python
Python中super()函数简介及用法分享
2016/07/11 Python
新手如何快速入门Python(菜鸟必看篇)
2017/06/10 Python
通过cmd进入python的实例操作
2019/06/26 Python
python每天定时运行某程序代码
2019/08/16 Python
PyCharm 专业版安装图文教程
2020/02/20 Python
Keras框架中的epoch、bacth、batch size、iteration使用介绍
2020/06/10 Python
Python可以用来做什么
2020/11/23 Python
html5指南-3.如何实现html元素拖拽功能
2013/01/07 HTML / CSS
使用HTML5做个画图板的方法介绍
2013/05/03 HTML / CSS
结构和类有什么异同
2012/07/16 面试题
2014年教师培训的自我评价
2014/01/03 职场文书
超市周年庆活动方案
2014/08/16 职场文书
2014年扶贫工作总结
2014/11/18 职场文书
学习保证书
2015/01/17 职场文书
承德避暑山庄导游词
2015/02/03 职场文书
2015年秋季校长开学典礼致辞
2015/07/29 职场文书
Apache POI操作批量导入MySQL数据库
2022/06/21 Servers