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 相关文章推荐
Linux下Python获取IP地址的代码
Nov 30 Python
用于统计项目中代码总行数的Python脚本分享
Apr 21 Python
python常用函数详解
Sep 13 Python
Python用zip函数同时遍历多个迭代器示例详解
Nov 14 Python
基于python的Tkinter编写登陆注册界面
Jun 30 Python
Python 给定的经纬度标注在地图上的实现方法
Jul 05 Python
python文件转为exe文件的方法及用法详解
Jul 08 Python
python使用正则来处理各种匹配问题
Dec 22 Python
PyQt5 closeEvent关闭事件退出提示框原理解析
Jan 08 Python
基于pytorch中的Sequential用法说明
Jun 24 Python
pytorch实现线性回归以及多元回归
Apr 11 Python
Python中22个万用公式的小结
Jul 21 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中取出的数据转化成XMl格式
2006/10/09 PHP
php使用date和strtotime函数输出指定日期的方法
2014/11/14 PHP
用PHP代码给图片加水印
2015/07/01 PHP
Laravel实现构造函数自动依赖注入的方法
2016/03/16 PHP
浅谈htmlentities 、htmlspecialchars、addslashes的使用方法
2016/12/09 PHP
php中html_entity_decode实现HTML实体转义
2018/06/13 PHP
PHP中的访问修饰符简单比较
2019/02/02 PHP
PHP实现对数字分隔加千分号的方法
2019/03/18 PHP
Windows Live的@live.com域名注册漏洞 利用代码
2006/12/27 Javascript
Firefox中autocomplete=&quot;off&quot; 设置不起作用Bug的解决方法
2011/03/25 Javascript
通过jquery还原含有rowspan、colspan的table的实现方法
2012/02/10 Javascript
JQuery入门—编写一个简单的JQuery应用案例
2013/01/03 Javascript
深入理解React中es6创建组件this的方法
2016/08/29 Javascript
详解前端自动化工具gulp自动添加版本号
2016/12/20 Javascript
Angular实现一个简单的多选复选框的弹出框指令实例
2017/04/25 Javascript
jQuery实现点击关注和取消功能
2017/07/03 jQuery
移动端网页开发调试神器Eruda的介绍与使用技巧
2017/10/30 Javascript
jQuery 导航自动跟随滚动的实现代码
2018/05/30 jQuery
Cordova(ionic)项目实现双击返回键退出应用
2019/09/17 Javascript
浅谈vuex为什么不建议在action中修改state
2020/02/02 Javascript
Python实现压缩与解压gzip大文件的方法
2016/09/18 Python
详解Python中最难理解的点-装饰器
2017/04/03 Python
详解 Python 读写XML文件的实例
2017/08/02 Python
Python编程使用NLTK进行自然语言处理详解
2017/11/16 Python
python的继承知识点总结
2018/12/10 Python
Python 开发工具PyCharm安装教程图文详解(新手必看)
2020/02/28 Python
使用py-spy解决scrapy卡死的问题方法
2020/09/29 Python
详解Django自定义图片和文件上传路径(upload_to)的2种方式
2020/12/01 Python
HTML5添加禁止缩放功能
2017/11/03 HTML / CSS
罗马尼亚购物网站:Vivantis.ro
2019/07/20 全球购物
JAVA的事件委托机制和垃圾回收机制
2014/09/07 面试题
村官学习十八大感想
2014/01/15 职场文书
初中科学教学反思
2014/01/21 职场文书
企业形象策划方案
2014/05/29 职场文书
SpringCloud Alibaba项目实战之nacos-server服务搭建过程
2021/06/21 Java/Android
python库Tsmoothie模块数据平滑化异常点抓取
2022/06/10 Python