📜  Python中的 str.format() 中的漏洞

📅  最后修改于: 2022-05-13 01:54:58.787000             🧑  作者: Mango

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() 是不是很糟糕?不,但是当它在用户控制的字符串上使用时会变得容易受到攻击。