簡體   English   中英

允許用戶輸入python的__import__會帶來安全風險嗎?

[英]Would allowing user input to python's __import__ be a security risk?

假設我使用Flask創建了一個簡單的Web服務器,並允許人們使用__import__語句查詢我在不同python文件中調制的某些內容,那么使用用戶提供的信息來進行操作是否會被視為安全風險?

例:

from flask import Flask

app = Flask(__name__)

@app.route("/<author>/<book>/<chapter>")
def index(author, book, chapter):
    return getattr(__import__(author), book)(chapter)  
    # OR
    return getattr(__import__("books." + author), book)(chapter)  

我最近在查看代碼時看到過這樣的情況,但是我覺得不合適。

這是完全不安全的,您的系統很容易受到攻擊。 您的第一個return行並不限制可以導入的名稱種類,這意味着用戶可以在任何可導入的Python模塊中執行任何可調用的名稱。

那包括:

/pickle/loads/<url-encoded pickle data>

泡菜是一種堆棧語言, 可讓您執行任意Python代碼 ,攻擊者可以完全控制您的服務器。

如果攻擊者也可以在PYTHONPATH文件系統上放置文件,則即使前綴為__import__也不安全。 他們所需要的只是路徑前面的books目錄。 然后,他們可以使用此路由在Flask進程中執行文件,再次讓他們獲得完全控制權。

我在這里完全不會使用__import__ 只需在開始時導入這些模塊然后使用字典映射author到已導入的模塊即可。 您仍然可以使用__import__在啟動時發現那些模塊,但是現在您刪除了從文件系統加載任意代碼的選項。

還應避免允許不受信任的數據直接調用模塊中的任意對象(包括getattr() )。 同樣,對系統的訪問受到限制的攻擊者可以利用此路徑來極大地擴展裂縫。 始終將輸入限制在可能選項的白名單中(例如,在開始時加載的模塊以及每個模塊中可以實際調用的對象)。

除了帶來安全風險外,這不是一個好主意,例如,我可以通過訪問url輕松使您的Web應用程序崩潰:

/sys/exit/anything

翻譯成:

...
getattr(__import__('sys'), 'exit')('anything')

不要給用戶導入/執行幾乎所有內容。 如@MartijnPieters明確指出的那樣,通過使用允許進口的字典來限制可能性。

暫無
暫無

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

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