什么是python格式化字符串漏洞
pyhton中,存在几种格式化字符串的方式,然而当我们使用的方式不正确的时候,即格式化的字符串能够被我们控制时,就会导致一些严重的问题,比如获取敏感信息
python常见的格式化字符串
百分号形式进行格式化字符串
>>> name = 'Hu3sky'
>>> 'My name is %s' %name
'My name is Hu3sky'
使用标准库中的模板字符串
string.Template()
>>> from string import Template
>>> name = 'Hu3sky'
>>> s = Template('My name is $name')
>>> s.substitute(name=name)
'My name is Hu3sky'
使用format进行格式化字符串
format的使用就很灵活了,比如以下
最普通的用法就是直接格式化字符串
>>> 'My name is {}'.format('Hu3sky')
'My name is Hu3sky'
指定位置
>>> 'Hello {0} {1}'.format('World','Hacker')
'Hello World Hacker'
>>> 'Hello {1} {0}'.format('World','Hacker')
'Hello Hacker World'
设置参数
>>> 'Hello {name} {age}'.format(name='Hacker',age='17')
'Hello Hacker 17'
百分比格式
>>> 'We have {:.2%}'.format(0.25)
'We have 25.00%'
获取数组的键值
>>> '{arr[2]}'.format(arr=[1,2,3,4,5])
'3'
用法还有很多,就不一一列举了
这里看一种错误的用法
先是正常打印
>>> config = {'SECRET_KEY': 'f0ma7_t3st'}
>>> class User(object):
... def __init__(self, name):
... self.name = name
>>> 'Hello {name}'.format(name=user.name)
Hello hu3sky
恶意利用
>>> 'Hello {name}'.format(name=user.__class__.__init__.__globals__)
"Hello {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': , 'config': {'SECRET_KEY': 'f0ma7_t3st'}, 'User': , '