[英]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.