一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

详解Python模板引擎的注入问题

时间:2017-01-03 编辑:简简单单 来源:一聚教程网

这几年比较火的一个漏洞就是jinjia2之类的模板引擎的注入,通过注入模板引擎的一些特定的指令格式,比如 {{1+1}} 而返回了 2 得知漏洞存在。实际类似的问题在Python原生字符串中就存在,尤其是Python 3.6新增 f 字符串后,虽然利用还不明确,但是应该引起注意。

最原始的 %

 
 代码如下 复制代码
userdata={"user":"jdoe","password":"secret"}
passwd=raw_input("Password: ")
 
ifpasswd !=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) 之外,还可以

 
 代码如下 复制代码
>>>importos
>>>'{0.system}'.format(os)
''
 

会先把 0 替换为 format 中的参数,然后继续获取相关的属性。

但是貌似只能获取属性,不能执行方法?但是也可以获取一些敏感信息了。

例子: http://lucumr.pocoo.org/2016/12/29/careful-with-str-format/

 
 代码如下 复制代码
CONFIG={
  'SECRET_KEY':'super secret key'
}
 
classEvent(object):
  def__init__(self,id, level, message):
    self.id=id
    self.level=level
    self.message=message
 
defformat_event(format_string, event):
  returnformat_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'
 

而且不仅仅限制为属性了,代码可以执行了。

 
 代码如下 复制代码
>>>importos
>>> 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 字符串,可能无法利用,还需要继续查一下。

热门栏目