什麼是程式碼注入?(工作原理,如何預防)
遠端程式碼執行 (RCE),通常稱為程式碼注入,是一種攻擊,攻擊者可以在其中將惡意程式碼注入應用程式並執行。這段外部程式碼能夠破壞資料安全性和完整性。它通常可以繞過身份驗證控制,這些攻擊通常與依賴使用者輸入執行的應用程式相關。
程式碼注入攻擊利用了鬆散的資料管理。這些攻擊通常由於缺乏足夠的輸入/輸出資料驗證而變得可行,例如:
資料格式
預期資料的數量
允許的字元
SQL 注入、指令碼注入、Shell 注入和動態評估是四種主要的程式碼注入形式。它們都基於相同的原理:程式碼被注入到程式中並由程式執行。
什麼是命令注入?
在命令注入中,攻擊者的選擇僅受注入語言的功能限制。如果攻擊者能夠將 PHP 程式碼注入應用程式並使其執行,則攻擊者僅受 PHP 功能的限制。命令注入是指使用現有程式碼執行命令,通常在 shell 上下文中執行。
程式碼注入是如何工作的?
當應用程式沒有足夠的輸入驗證或沒有清理它儲存的資料時,它就會面臨程式碼注入的風險。
在瞭解其工作原理之前,讓我們先討論一下“使用者輸入”是什麼。簡單來說,使用者輸入是指使用者輸入到應用程式中並隨後由程式處理的任何資料。
根據建立者,程式只設計為接受特定型別的輸入。程式碼注入的應用程式預期特定型別的資料。在極少數情況下,開發人員可能會在確保向程式提供正確的資料方面粗心大意。
程式碼注入攻擊可能會影響各種應用程式。程式碼注入是透過 **eval()** 函式完成的。攻擊者透過插入程式碼作為使用者輸入來利用程式。攻擊成功後,攻擊者可以訪問系統資訊和資料庫。
駭客首先在應用程式中尋找可以接收不受信任的資料並利用它執行計算機程式碼的攻擊面。例如直接輸入,如檔案上傳和表單欄位,以及其他資料來源,如 Cookie 和查詢字串引數。
通常使用字元字串的直接串聯、PHP eval() 函式或其他語言中的等效函式來引入程式碼。如果漏洞成功利用,攻擊者可以訪問應用程式的伺服器端直譯器。攻擊者可以使用系統呼叫在伺服器上執行指令並訪問更多資訊。
如何預防程式碼注入攻擊?
開發人員可以採取以下預防措施來防止程式碼注入攻擊:
對輸入驗證使用白名單
白名單更容易設定,並允許安全團隊更好地控制應用程式可以處理的資料或輸入型別,從而降低攻擊者執行惡意程式碼的可能性。
使用上下文輸出編碼
使用上下文輸出編碼將有害輸入轉換為更安全的表示形式,在其中可以顯示使用者資料,但不能將其作為程式碼執行。
使用靜態型別系統
為了確保語言分離,請使用靜態型別系統。使用靜態型別系統,團隊可以建立宣告性控制檢查,而無需額外的執行時成本。
避免在原始碼中使用不安全的函式
在開發原始碼時,避免使用任何易受攻擊的程式碼評估結構至關重要。相反,開發人員應該使用安全的、特定於語言的功能來管理使用者提供的輸入。
在 Cookie 上使用 HttpOnly 標誌
在 Cookie 上使用 HttpOnly 標誌以防止客戶端指令碼互動。伺服器建立的每個 Cookie 上的 HttpOnly 標誌都表示該 Cookie 不應從客戶端訪問。因此,即使存在 HTML 注入問題,Cookie 也無法與第三方共享。