SQL 注入是最常見和最基本的網絡攻擊類型之一。不幸的是,SQL 注入也是應用程序可能面臨的最具破壞性的威脅之一。這些攻擊經常導致數據丟失,對共享數據庫的基礎設施尤其危險。本文介紹了 如何防止 SQL 注入。請繼續閱讀以了解什么是 SQL 注入、這些攻擊的工作原理以及公司采取哪些步驟來保護其數據庫免受惡意注入。
什么是 SQL 注入攻擊?
SQL 注入 (SQLi) 是一種網絡攻擊,黑客通過應用程序運行惡意 SQL 語句來操縱數據庫。這些攻擊會影響任何依賴 SQL 數據庫(MySQL、Oracle、Sybase、Microsoft SQL Server、Access、Ingres 等)的網站或 Web 應用程序。
我們的 MySQL 命令備忘單 概述了掌握此 RDBMS 所需的最重要命令。
SQLi 的后果從輕微到嚴重不等。在注入之后,黑客可以:
- 損壞、竊取或刪除數據。
- 獲得對系統的 root 訪問權限。
- 創建新記錄為更高級的漏洞打開大門,例如 APT 攻擊。
- 提升訪問網絡上其他應用程序和系統的權限。
- 損害服務器或其他后端基礎設施。
- 發起 DDoS(拒絕服務)攻擊。
- 通過數據庫服務器訪問操作系統 。
傷害的程度取決于攻擊者的能力。受害者可能會遇到從幾個數據庫錯誤到完全接管 Web 服務器的任何事情。
如何防止 SQL 注入攻擊?
企業可以采取多種有效措施來防止 SQLi 攻擊。
消毒輸入
輸入清理(或驗證)是檢查和過濾用戶輸入的做法。這種技術確保應用程序可以識別非法用戶輸入和危險的可執行文件。
開發人員可以通過三種方式清理輸入:
- 白名單清理: 只有預先批準的字符和代碼字符串才能到達數據庫。
- 黑名單清理: 開發人員禁止某些字符進入數據庫(換行符、額外的空格、標簽、制表符等)。
- 轉義清理: 查詢中的所有數據都需要在查詢執行之前進行 SQL 轉義。
通常,白名單比黑名單更簡單、更安全。聰明的黑客可以找到繞過黑名單的方法,因此請盡可能使用白名單驗證用戶輸入。
另一個好的做法是使用下拉菜單和單選按鈕驗證用戶輸入。這些輸入字段可防止用戶輸入輸入并停止注入可執行代碼。
參數化 SQL 代碼
參數化查詢要求開發人員首先定義所有 SQL 代碼,然后將每個參數傳遞給查詢。這種編碼風格使數據庫能夠區分代碼和數據,這是動態 SQL 查詢無法實現的功能。
參數化 SQL 代碼可防止攻擊者更改查詢的意圖,即使他們插入了命令。例如,如果黑客輸入用戶 ID '1'='1,則查詢將查找與整個'1'='1 字符串匹配的用戶名 。數據庫不會將查詢作為命令接受。
限制用戶權限
采用 零信任安全性 并將用戶限制為他們執行角色所需的最低限度的權限。具有讀寫執行權限的帳戶越少越好。
例如,如果一個網站只返回數據庫內容與 SELECT 聲明,不授予連接其他特權,比如 INSERT, UPDATE或者 DELETE。
另一個好的做法是不信任所有用戶輸入。以與來自外部和第三方來源的輸入相同的方式處理來自內部用戶的輸入。此外,永遠不要讓 Web 應用程序以管理員權限連接到數據庫。
設置防火墻
使用 Web 應用程序防火墻 (WAF) 過濾 Web 應用程序和數據庫之間的所有流量。防火墻保護所有面向 Web 的應用程序,因此設置防御以阻止 SQLi 和類似的網絡攻擊。
- 閱讀有關 不同類型防火墻的信息, 并找到能夠為您的企業提供理想保護的防火墻。
- 更新和補丁
- 使用最新的補丁和更新使所有系統和防御保持最新。這樣做有助于:
- 捕獲允許 SQL 注入的新錯誤。
- 防止攻擊者利用舊軟件版本中存在的弱點和錯誤。
- 定期修補所有 Web 應用程序軟件組件,包括庫、插件、框架、Web 服務器和數據庫服務器。
定期測試
運行安全測試以檢查數據庫和相關應用程序的彈性。定期測試對于發現所有網絡攻擊的漏洞至關重要。考慮運行:
- 從攻擊者的角度查看應用程序的動態分析測試 (DAST)。
- 在代碼級別尋找漏洞的靜態分析測試 (SAST)。
- 對應用程序中潛在入口點的手動測試也有助于檢測 SQLi 漏洞。這里有幾個測試需要考慮:
- 提交單引號字符并檢查數據庫響應。
- 運行布爾條件(OR 1=1、OR 1=2 等)并查找響應中的差異。
- 提交在執行時觸發時間延遲的有效負載。測量響應時間的差異。
- 運行觸發帶外網絡交互的 OAST 負載。監控潛在漏洞的結果交互。
- 了解 滲透測試,這是市場上最全面、最真實的測試形式。
- 永遠不要以純文本形式存儲敏感數據
加密數據庫中的所有私人和機密數據。如果攻擊者設法泄露敏感數據,加密還提供了額外的保護級別。
不向用戶顯示數據庫錯誤
數據庫錯誤消息絕不能顯示在客戶端 Web 瀏覽器上。攻擊者可以使用錯誤消息中的技術細節來調整查詢以實現成功注入。
不要顯示帶有有用信息的錯誤消息,而是設置簡單的基于單詞的錯誤消息,為給您帶來的不便表示歉意。
培訓和維護 SQLi 意識
防止 SQL 注入是一項團隊工作,所有員工都必須知道網絡安全的重要性 。為所有開發人員、QA 人員、系統管理員和DevOps提供合適的安全培訓 。
雖然很危險,但 SQLi 攻擊很容易預防
盡管 SQL 注入可能具有破壞性,但組織良好的公司永遠不應成為這些攻擊的受害者。設置適當的預防措施并確保您的數據庫能夠抵抗 SQL 注入。