Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这是python eval()的安全使用吗?_Python_Security - Fatal编程技术网

这是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()?啊,您确实按照建议尝试了额外的情况!很好。