最原始的 %
代码如下 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 字符串,可能无法利用,还需要继续查一下。
http://m.bbyears.com/jiaocheng/117562.html
推荐访问: