簡體   English   中英

這是python eval()的安全使用嗎?

[英]Is this a safe use of python eval()?

如果攻擊者可以控制的值attacker_controlled_nasty_variable ,是這個代碼段脆弱?

dic={"one":1,
      "nasty":attacker_controlled_nasty_variable,
     }
store=str(dict)
...
dic=eval(store)

使用ast.literal_eval()而不是eval()

是。 它可以替換為具有__repr__()方法的對象,該方法具有有效負載本身,或者返回傳遞給eval()時可能不安全的字符串。

概念證明:

class MyClass(object):
  def __repr__(self):
    return 'os.system("format c:")'

bad = [MyClass()]
print str(bad)

它是安全的,只要你可以確定attacker_controlled_nasty_variable永遠不是攻擊者可以控制__repr__ (或__str__ )的對象,否則它會注入python代碼。

但是,最好使用repr(dic)而不是str(dic)因為只有repr才能返回有效的python代碼。

另外 - 正如@payne所提到的 - 使用更安全的ast.literal_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}

您可能想嘗試更多案例,但從經驗__repr__正在引用內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM