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常用随机数与随机字符串方法实例
Apr 09 Python
Python利用multiprocessing实现最简单的分布式作业调度系统实例
Nov 14 Python
磁盘垃圾文件清理器python代码实现
Aug 24 Python
PyQt5每天必学之切换按钮
Aug 20 Python
浅谈python中get pass用法
Mar 19 Python
python异步存储数据详解
Mar 19 Python
python yield和Generator函数用法详解
Feb 10 Python
部署Django到阿里云服务器教程示例
Jun 03 Python
Django+Uwsgi+Nginx如何实现生产环境部署
Jul 31 Python
Python制作数据预测集成工具(值得收藏)
Aug 21 Python
Django前后端分离csrf token获取方式
Dec 25 Python
OpenCV-Python使用cv2实现傅里叶变换
Jun 09 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将整个网站生成HTML纯静态网页的方法总结
2012/02/05 PHP
使用php实现下载生成某链接快捷方式的解决方法
2013/05/07 PHP
基于linnux+phantomjs实现生成图片格式的网页快照
2015/04/15 PHP
PHP面向对象程序设计OOP继承用法入门示例
2016/12/27 PHP
PHP第三方登录―QQ登录实现方法
2017/02/06 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
2020/02/18 PHP
JS处理VBArray的函数使用说明
2008/05/11 Javascript
JavaScript 对Cookie 操作的封装小结
2009/12/31 Javascript
JavaScript 原型继承之构造函数继承
2011/08/26 Javascript
jQuery实现表格颜色交替显示的方法
2015/03/09 Javascript
jQuery Ajax调用WCF服务详细教程
2015/03/31 Javascript
JS实现环形进度条(从0到100%)效果
2016/07/05 Javascript
JS声明式函数与赋值式函数实例分析
2016/12/13 Javascript
获取今天,昨天,本周,上周,本月,上月时间(实例分享)
2017/01/04 Javascript
JS实现基于Sketch.js模拟成群游动的蝌蚪运动动画效果【附demo源码下载】
2017/08/18 Javascript
BetterScroll 在移动端滚动场景的应用
2017/09/18 Javascript
angular.js实现购物车功能
2017/10/23 Javascript
微信小程序实现二维码签到考勤系统
2020/01/16 Javascript
Element Breadcrumb 面包屑的使用方法
2020/07/26 Javascript
在vscode 中设置 vue模板内容的方法
2020/09/02 Javascript
详解JavaScript执行模型
2020/11/16 Javascript
Django自定义认证方式用法示例
2017/06/23 Python
Python进度条实时显示处理进度的示例代码
2018/01/30 Python
python实现简单tftp(基于udp协议)
2018/07/30 Python
python单线程文件传输的实例(C/S)
2019/02/13 Python
Django自定义用户登录认证示例代码
2019/06/30 Python
Python内建序列通用操作6种实现方法
2020/03/26 Python
美国在线眼镜商城:Eyeglasses.com
2017/06/26 全球购物
英国评分最高的女性剃须刀订阅盒:FFS Beauty
2018/01/25 全球购物
廉价连衣裙和婚纱礼服在线销售:Tbdress
2019/02/28 全球购物
shell程序如何生命变量?shell变量是弱变量吗?
2014/11/10 面试题
高分子材料个人求职信范文
2013/09/25 职场文书
餐饮企业总经理岗位职责范文
2014/02/18 职场文书
薪酬专员岗位职责
2014/02/18 职场文书
讲文明倡议书
2015/04/29 职场文书
Django框架之路由用法
2022/06/10 Python