Python 模板引擎的注入问题分析

作者:virusdefender 时间:2021-05-26 17:05:30 

这几年比较火的一个漏洞就是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,模板注入
0
投稿

猜你喜欢

  • MySQL中因一个双引号错位引发的血案详析

    2024-01-21 09:59:25
  • Bootstrap显示与隐藏简单实现代码

    2023-08-24 17:30:54
  • python小技巧——将变量保存在本地及读取

    2022-02-14 23:35:14
  • Python&Matlab实现蚂蚁群算法求解最短路径问题的示例

    2021-09-18 15:40:11
  • 用ASP和SQL语句动态的创建Access表

    2008-10-14 16:59:00
  • 浅谈Python数学建模之线性规划

    2021-02-11 17:57:35
  • 面向对象设计过程中必须遵守的相关准则

    2009-01-08 15:52:00
  • 浅谈Keras参数 input_shape、input_dim和input_length用法

    2021-02-19 13:24:40
  • 浅谈对Python变量的一些认识理解

    2021-06-10 05:06:52
  • Javascript对象中关于setTimeout和setInterval的this介绍

    2024-04-17 09:55:15
  • VBScript中变量作用域

    2007-11-02 10:03:00
  • python入门学习笔记分享

    2023-01-29 17:46:16
  • python实现画出e指数函数的图像

    2023-09-24 22:12:10
  • python GUI库图形界面开发之PyQt5中QWebEngineView内嵌网页与Python的数据交互传参详细方法实例

    2021-07-28 18:28:45
  • springboot 启动时初始化数据库的步骤

    2024-01-26 18:32:57
  • python快速编写单行注释多行注释的方法

    2022-06-04 07:06:54
  • Python计算机视觉里的IOU计算实例

    2021-12-07 18:15:10
  • 基于Python编写一个简单的服务注册发现服务器

    2022-06-11 20:23:31
  • 应用技术:如何通过SQLyog分析MySQL数据库

    2009-03-25 16:53:00
  • pytorch模型保存与加载中的一些问题实战记录

    2021-09-03 21:41:50
  • asp之家 网络编程 m.aspxhome.com