Python中的 str.format() 中的漏洞
先决条件: Python – format()函数
str.format()是 Python3 中的字符串格式化方法之一,它允许多次替换和值格式化。此方法允许我们通过位置格式连接字符串中的元素。这似乎是一件很酷的事情。但是当我们的Python应用程序在用户控制的字符串中使用 str.format 时,就会出现漏洞。此漏洞可能导致攻击者获取敏感信息的访问权限。
注意:此问题已在此处报告
str 格式漏洞
那么这怎么会变成一个漏洞。让我们看看下面的例子
例子:
# Let us assume this CONFIG holds some sensitive information
CONFIG = {
"KEY": "ASXFYFGK78989"
}
class PeopleInfo:
def __init__(self, fname, lname):
self.fname = fname
self.lname = lname
def get_name_for_avatar(avatar_str, people_obj):
return avatar_str.format(people_obj = people_obj)
# Driver Code
people = PeopleInfo('GEEKS', 'FORGEEKS')
# case 1: st obtained from user
st = input()
get_name_for_avatar(st, people_obj = people)
情况1:
当用户提供以下 str 作为输入时
Avatar_{people_obj.fname}_{people_obj.lname}
输出:
Avatar_GEEKS_FORGEEKS
案例二:
当用户输入以下 str 作为输入时
{people_obj.__init__.__globals__[CONFIG][KEY]}
输出:
ASXFYFGK78989
这是因为字符串格式化函数也可以访问可能泄漏数据的属性对象。现在可能会出现一个问题。使用 str.format() 是不是很糟糕?不,但是当它在用户控制的字符串上使用时会变得容易受到攻击。