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