查看: 999|回复: 0

[Android教程] Python学习之模板字符串与模板注入

发表于 2017-1-3 23:28:54
游戏辅助AD
这几年python开发http://www.maiziedu.com/course/python/中,比较火的一个漏洞就是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方法相关
  除了上面的payload改写为 print ("Password " + passwd + " is wrong for user {user}").format(**userdata)之外,还可以
  >>> import os>>> '{0.system}'.format(os)''
  会先把 0 替换为 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下变量的能力。
  >>> 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 字符串,可能无法利用,还需要继续查一下。

来源:virusdefender's blog



回复

使用道具 举报