这几年比较火的一个{{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
如果 format_string
为 {event.__init__.__globals__[CONFIG][SECRET_KEY]}
就可以泄露敏感信息。
Python 3.6中的 f
字符串
这个字符串非常厉害,和Javascr
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
但是貌似 没有
把一个普通字符串转换为 f
字符串的方法,也就是说用户很可能无法控制一个 f
字符串,可能无法利用,还需要继续查一下。