这是python eval()的安全使用吗?
如果攻击者可以控制这是python eval()的安全使用吗?,python,security,Python,Security,如果攻击者可以控制attacker\u controlled\u astery\u variable的值,那么这段代码是否易受攻击 dic={"one":1, "nasty":attacker_controlled_nasty_variable, } store=str(dict) ... dic=eval(store) 对。它可以替换为一个对象,该对象具有一个\uuu repr\uuuu()方法,该方法本身具有一个有效负载,或者返回一个在传递到eval()时可能不安全的
attacker\u controlled\u astery\u variable
的值,那么这段代码是否易受攻击
dic={"one":1,
"nasty":attacker_controlled_nasty_variable,
}
store=str(dict)
...
dic=eval(store)
对。它可以替换为一个对象,该对象具有一个
\uuu repr\uuuu()
方法,该方法本身具有一个有效负载,或者返回一个在传递到eval()时可能不安全的字符串
概念证明:
class MyClass(object):
def __repr__(self):
return 'os.system("format c:")'
bad = [MyClass()]
print str(bad)
只要您能够确保攻击者\u控制的\u讨厌的\u变量
永远不是攻击者可以控制\uuuu repr\uuu
(或\uu str\uu
)的对象,这是安全的,因为他可以注入python代码
但是,最好使用repr(dic)
而不是str(dic)
,因为只有repr
才能返回有效的python代码
此外,正如@payne所提到的,使用safe而不是eval()
使用ast.literal\u eval()
而不是eval()
让我们试试:
>>> attacker_controlled_nasty_variable="`cat /etc/passwd`"
>>> dic={"one":1,
... "nasty":attacker_controlled_nasty_variable,
... }
>>> store = repr(dic)
>>> store
"{'nasty': '`cat /etc/passwd`', 'one': 1}"
>>> dic=eval(store)
>>> dic
{'nasty': '`cat /etc/passwd`', 'one': 1}
>>> attacker_controlled_nasty_variable="'hello',}"
>>> dic={"one":1,
... "nasty":attacker_controlled_nasty_variable,
... }
>>> repr(dic)
'{\'nasty\': "\'hello\',}", \'one\': 1}'
>>> eval(repr(dic))
{'nasty': "'hello',}", 'one': 1}
您可能想尝试更多的案例,但从经验上看,\uuuuurepr\uuuuuuu
正确引用了内容。因为攻击者可以编辑您的Python源代码,所以这个问题相当愚蠢,是吗?谁说攻击者正在本地机器上运行代码?@Tim Pietzcker:如果不在本地机器上运行,攻击者是如何设置讨厌的变量的?@S.Lott SQL注入、配置文件、网页上的表单-很多方法…。@S.Lott然而许多人确实编写了非常糟糕的代码。根据应用程序的不同,您可能希望允许用户拥有他们自己的配置文件,这些文件是他们上传的,并针对他们的帐户运行的,但是,如果您不清理您的输入,则会出现漏洞。最重要的是,并不是所有的项目都是由一个人(很少有人)重新开发的,所以要尽可能地完善你的代码,它可以弥补你所在学院的一些不足。你能举个例子吗?在他的例子中,我试图将攻击如何通过str()操作可视化。类bad_repr(object):def__repr___(self):返回'evil'
(如果他的变量只能是字符串,他就不能这样做)使用该类,字符串化的dict将看起来像{asthy':evil,'one':1}
-因此邪恶
没有被引用,几乎可以是任何python代码。这个线程中的关键点似乎是潜在攻击者是否可以设置对象,或者仅设置字符串值。@payne,这是一个重要点,因为在上面的代码中,讨厌的输入将是一个字符串,因此不可利用。那么:class Bad:def\uu repr\uuuuu(self):os.system(“做坏事)\attacker\u controlled\u asthy\u variable=Bad()?啊,您确实按照建议尝试了额外的情况!很好。