什麼是 SQL 注入? 如何防止 SQLi 攻擊
已發表: 2023-09-15Web 應用程序日復一日地為我們的在線體驗提供動力。 我們使用網絡應用程序進行聯繫、互動、購物和觀看有趣的貓咪視頻。 它們提供重要的業務服務並保存敏感數據,但我們使用的東西越多,它就越容易受到攻擊。
針對利用結構化查詢語言 (SQL) 漏洞的應用程序,需要警惕的一種網絡攻擊是常見且危險的 SQL 注入。
什麼是SQL注入?
SQL 注入 (SQLi) 是網絡攻擊者用來利用 Web 應用程序中的漏洞的有害代碼注入技術。 他們利用這些弱點,通過向數據庫查詢添加一串惡意代碼來獲得未經授權的訪問。
SQL 注入攻擊會導致不當的數據訪問、操縱、身份盜竊、財務損失、聲譽損害和法律後果。 開發人員和組織必須了解其風險並實施全面的安全措施。 Web 應用程序防火牆 (WAF) 軟件和數字取證軟件等工具旨在防範 SQL 注入攻擊。 企業還可以依靠全面的網站安全套件來保護他們的應用程序。
閱讀此 SQL 注入備忘單,了解 SQL 攻擊是如何執行的,並提供示例、它們的變體以及如何防止此類攻擊。
為什麼 SQL 注入攻擊很危險?
SQL 注入多年來一直位列開放全球應用程序安全項目 (OWASP) 的 Web 應用程序安全風險前 10 名。 僅在 2022 年,OWASP 就在他們測試的應用程序中發現了 274,000 多次某種形式的注入; SQL 注入和跨站腳本 (XSS) 是最常見的。
攻擊者可以使用 SQl 注入來導致:
- 由於修改或刪除數據庫中的信息而導致Web 應用程序出現錯誤。
- 如果黑客未經授權訪問數據庫中存儲的敏感數據(例如個人信息、財務記錄或密碼),則數據洩露。
- 通過訪問使用相同共享數據庫的其他未經授權的系統來破壞系統。 這使得攻擊者能夠將攻擊升級到同一網絡上的其他系統或執行分佈式拒絕服務 (DDoS)。
這些破壞性行為對企業造成不可挽回的損害。 這些犯罪行為損害了隱私和數據完整性,導致客戶信任和商業聲譽喪失。 這也給公司處理善後工作增加了財務負擔。
現實生活中的 SQL 注入攻擊示例
自 SQL 注入首次出現以來已有二十多年了。 二十年後,它仍然臭名昭著,以下著名的 SQL 注入事件就證明了這一點。
- Heartland Payments Systems:2008 年,Heartland Payments Systems 遭受了歷史上最大的數據洩露事件之一,通過 SQLi 攻擊暴露了超過 1.3 億信用卡和借記卡詳細信息。 Heartland 支付了數百萬美元的罰款。
- 雅虎:2012 年,一次 SQL 注入攻擊洩露了近 500 萬雅虎用戶的帳戶詳細信息,包括電子郵件地址和密碼。
- Freepik:2020 年,黑客在針對 Freepik 和 Flaticon 網站的 SQL 注入攻擊中竊取了 830 萬 Freepik 和 Flaticon 用戶的電子郵件和密碼。
- WooCommerce:流行的 WordPress 插件修復了一個 SQL 注入漏洞,該漏洞使 500 萬個網站面臨數據被盜的風險。
- BillQuick:網絡犯罪分子利用流行計費平台中的盲目 SQL 漏洞來傳播勒索軟件。
- MOVEit:2023 年 5 月,Cl0p 勒索軟件團伙利用託管文件傳輸軟件工具 MOVEit 中的 SQL 注入漏洞,影響了 1000 多個組織和至少 6000 萬人,成為當年迄今為止最大規模的數據洩露事件。
SQL注入攻擊是如何運作的?
讓我們看一下現代 Web 應用程序中使用的數據庫和 SQL 查詢的基礎知識。 這將幫助我們更好地理解 SQL 注入的內部工作原理。
所有網站都使用關係數據庫(也稱為 SQL 數據庫)來存儲有關其用戶和應用程序的數據。 它可以是用戶信息、登錄憑據、付款信息或有關公司的任何其他信息。 以電子商務網站為例。 它將產品數據、用戶帳戶、訂單數據和支付信息存儲在數據庫中。
然後,網站從這些數據庫中獲取數據並提供特定於用戶的內容或服務。 這個過程的發生要歸功於 SQL,一種用於管理數據庫的標準化編程語言。 每當您需要從應用程序獲取某些內容(例如您的購買歷史記錄)時,您實際上是在使用 SQL 查詢(指示數據庫執行特定操作的命令)向數據庫發出請求。
為了使 Web 交互變得無縫,許多網站允許用戶輸入數據來進行 SQL 查詢。 這可以包括搜索詞、用戶名或付款詳細信息等內容。
考慮電子商務網站的示例。 使用“訂單”表 (o) 和“產品”表 (p) 顯示數據庫中的訂單歷史記錄的簡單 SQL 查詢如下:
SELECT o.order_id、o.order_date、p.product_name、p.price
FROM 訂單 o
連接產品 p ON o.product_id = p.product_id
其中o.user_id = 12345;
此 SQL 代碼從訂單表中選取訂單 ID 和日期,並從網站數據庫中用戶 ID 12345 的產品表中選取產品名稱和價格。 通常,ID 將基於用戶的輸入。 當輸入沒有得到正確的檢查和控制時就會出現問題。 攻擊者利用該漏洞進行SQL注入攻擊。
以下是它通常的展開方式。
- 識別易受攻擊的輸入字段:攻擊者首先在 Web 應用程序上查找可能注入惡意代碼的輸入字段。 他們提交不同的值並查看應用程序如何響應。 找出是否。 如果應用程序未正確驗證或清理用戶輸入,應用程序會將其輸入作為 SQL 代碼進行處理。 該潛在漏洞用於代碼注入。
- 通過用戶輸入進行代碼注入:在了解應用程序如何處理輸入後,攻擊者構建一個有效負載,這是一段利用該漏洞的惡意 SQL 代碼。 這包括添加 SQL 控製字符,如單引號 (')、雙引號 (“) 或等號 (=) 來更改 SQL 查詢結構。 將這些控製字符與常見的 SQL 命令(如 SELECT 和 FROM)一起使用,可以讓攻擊者從數據庫服務器訪問或檢索數據。
然後,他們提交特製的輸入以及合法的請求,欺騙應用程序將可疑代碼視為查詢的合法部分。 - 執行:數據庫在不知道攻擊的情況下處理查詢並執行注入的代碼,就好像它是合法請求一樣。
- 漏洞利用:根據攻擊者的意圖,注入的 SQL 代碼可能會檢索敏感數據、修改或刪除信息,甚至授予未經授權的訪問權限。 這會危及應用程序的安全性,可能會暴露敏感信息。
SQL注入示例
考慮一個 Web 應用程序,它使用 URL 參數根據產品 ID 獲取產品詳細信息,如下所示:
http://example.com/products?id=1
攻擊者可能會嘗試注入惡意 SQL 代碼以導致錯誤並檢索如下信息: http://example.com/products?id=1' OR 1=1; –
如果應用程序無法充分驗證和清理用戶輸入,則可以按如下方式操作 SQL 查詢:
從產品中選擇 * WHERE OR 1=1; - - ';
在本例中,原始查詢旨在檢索 ID 為 1 的產品,但攻擊者的輸入修改了查詢以返回所有產品,因為添加了 1=1 和附加的雙連字符 (- -)。 它使原始的結束單引號無效,並導致顯示所有產品詳細信息或顯示攻擊者可以利用的錯誤消息。
33%
2022 年,80% 的 Web 應用程序關鍵漏洞是由 SQL 注入造成的。
資料來源:Statista
SQL 漏洞的廣泛流行以及 Web 應用程序數據庫及其所有關鍵業務數據的吸引力使得 SQL 注入成為最持久的網絡攻擊之一。
來源: Spiceworks
SQL注入攻擊的類型
根據攻擊者檢索信息或與數據庫交互的方式,SQL 注入攻擊主要分為三種類型:
- 經典或帶內 SQLi
- 盲目或推理 SQLi
- 帶外 SQLi
1. 經典或帶內 SQLi
帶內是最常見的 SQL 注入攻擊類型。 經典黑客使用相同的通信通道(帶內)注入惡意 SQL 代碼並檢索結果。 帶內 SQLi 的兩個主要變體是:
基於聯合的帶內 SQLi
此攻擊利用 UNION SQL 運算符,用於組合兩個或多個 SELECT 語句結果中的數據。 通過這樣做,攻擊者可以從他們無法直接訪問的表中檢索數據。
基於錯誤的帶內 SQLi
在這種技術中,攻擊者故意觸發 SQL 查詢中的錯誤,以利用數據庫返回的錯誤消息。 這些錯誤可以揭示有關數據庫結構、表名、列名,有時甚至是數據本身的有價值的信息。 基於錯誤的 SQLi 也可以作為帶外 SQLi 執行。
2. 推理(盲)SQLi
在盲目的 SQLi 中,攻擊者無法直接看到攻擊的結果。 相反,他們通過觀察響應其查詢的應用程序行為或錯誤消息來推斷信息。 這種類型的攻擊非常耗時,因為黑客必須進行一系列 SQL 查詢才能找到可利用的潛在漏洞。 盲 SQLi 的兩種變體是:
基於時間的盲 SQLi
在這裡,攻擊者提出的查詢使數據庫在做出反應之前延遲其響應。 他們通過關注響應時間來推斷有關數據庫的信息。
布爾盲 SQLi
對於布爾盲 SQLi,攻擊者利用應用程序響應 SQL 查詢中的真或假條件的方式。 根據 Web 應用程序的響應,即使沒有返回數據庫中的數據,它們也會推斷有關數據庫的信息。
3. 帶外 SQLi
帶外 SQLi 攻擊會導致應用程序將數據發送到黑客控制的遠程端點。 此類攻擊要求 SQL 服務器具有某些功能,例如能夠發起超文本傳輸協議 (HTTP) 請求等外部網絡請求。
如何防止 SQL 注入攻擊:備忘單
防止 SQL 注入需要採用多層方法,包括安全編碼實踐和持續監控。 下面是一份備忘單,其中包含可幫助您免受 SQL 注入攻擊的基本步驟。
使用準備好的語句
針對 SQL 注入攻擊的主要防禦措施是使用參數化查詢準備語句。 準備好的語句確保用戶輸入被視為數據而不是可執行代碼。
開發人員預先將用於查詢的 SQL 代碼編譯為帶有佔位符的模板,用於用戶輸入的值。 在查詢執行時,準備好的語句綁定實際值而不是佔位符。 這會阻止惡意代碼的執行。
準備好的語句優於動態 SQL 語句。 它們在執行期間編寫 SQL 查詢,這削弱了它們抵御注入攻擊的能力。
流行編程語言中的準備語句:
以下是在流行的數據庫編程中使用準備好的語句(參數化查詢)的特定於語言的建議:
- Java 企業版 (EE):使用 java.sql 包中的PreparedStatement類。 使用setString 、 setInt等方法綁定參數。
- Python (SQLite3) :在查詢中使用佔位符 ( ? )。 使用元組或列表綁定參數。
- PHP:使用PHP 數據對象 (PDO)擴展。 使用帶有佔位符 (:) 的準備好的語句。 使用bindValue或bindParam綁定參數。
- .NET :使用MySqlCommand對象。 使用Parameters.AddWithValue綁定參數。
另一種預防 SQL 注入的方法是使用存儲過程或一組可以反複使用的預編譯 SQL 代碼。
練習輸入驗證
輸入驗證涉及在處理之前檢查用戶輸入以確保其滿足特定標準。 允許列表(也稱為白名單)是輸入驗證的一個關鍵方面。 在這裡,僅接受預定義的安全值或模式作為 SQL 查詢的一部分。 任何不符合設定條件的輸入都會被拒絕。 這可以有效防止惡意或意外輸入進入系統。
使用對象關係映射庫
對象關係映射 (ORM) 庫對於使用關係數據庫的開發人員來說是很有價值的工具。 它們允許開發人員使用他們選擇的編程語言與數據庫進行交互,從而減少編寫原始 SQL 查詢的需要。 ORM 庫提供針對 SQL 注入攻擊的內置保護。
對開發人員和 IT 團隊進行安全編碼實踐培訓。 確保定期進行安全審核和滲透測試以發現漏洞。
提示:使用安全代碼培訓工具幫助您的程序員和開發人員更快地學習安全編碼。
執行最小權限原則
最小權限原則只給予數據庫用戶完成其工作所需的最小權限。 遵循這一原則可以減少潛在 SQL 注入攻擊或任何網絡攻擊的影響。 另外,對數據庫應用嚴格的訪問控制。
部署 Web 應用程序防火牆 (WAF)
WAF 監視應用程序的傳入網絡流量,並根據眾所周知的攻擊簽名列表阻止潛在的惡意流量。
前 5 個 Web 應用程序防火牆 (WAF) 工具:
- Azure Web 應用程序防火牆
- AWS 網絡應用防火牆
- Imperva Web 應用程序防火牆 (WAF)
- Cloudflare 頻譜
- 賽門鐵克 Web 應用程序防火牆和反向代理
*以上是 G2 2023 年夏季網格報告中的五種領先 WAF 解決方案。
WAF 使用預定義的規則來檢測傳入流量中的可疑模式和異常,例如 SQL 關鍵字和惡意負載。 它清理和驗證用戶輸入並阻止或過濾掉有害請求。 這有助於阻止危險的 SQL 查詢進入系統。
現代 WAF 使用機器學習來適應新的攻擊方法。
其他防止SQL注入攻擊的安全工具
除了 WAF 之外,其他幾個安全平台也可以阻止 SQL 注入攻擊。
- 漏洞掃描器尋找 Web 應用程序中已知和未知的漏洞。
- 靜態應用程序安全測試(SAST)工具和靜態代碼分析軟件無需實際執行代碼即可發現安全漏洞。
- 動態應用程序安全測試軟件模擬對正在運行的應用程序的攻擊並識別弱點。
- 入侵檢測和防禦系統以及數字取證軟件實時調查應用程序的異常情況和攻擊。
守護您的數據堡壘
SQL注入攻擊對Web應用程序安全構成嚴重威脅。 如果攻擊成功,公司將面臨失去寶貴數據、用戶隱私和良好聲譽的風險。
雖然沒有任何單一解決方案能夠保證針對 SQL 注入的絕對安全,但結合我們在此討論的預防措施可以顯著減少攻擊的機會。 Web 開發人員和數據庫管理員應採取嚴格的防禦措施並強化其 Web 應用程序以防止潛在的利用。
想要一個全面的解決方案來保護您的網站嗎? 探索網絡安全軟件及其如何幫助抵禦導致數據洩露的網絡攻擊。