您是否意識到 SQL 注入漏洞的威脅越來越大?2022 年第四季度,AppTrana 阻止了 1,111,548 次此類攻擊。在短短三個月內阻止了超過一百萬次 SQL 注入攻擊,很明顯 Web 應用程序正處于圍攻之中。
現在如何保持領先地位并保護您的業務?這是了解此OWASP 前 10 大漏洞以及如何防止 SQL 注入攻擊的指南。什么是數據庫和SQL?數據庫是一組描述的表,可以從中訪問或存儲數據。數據庫應用程序需要前端和數據庫之間的通信媒介。這就是 SQL 發揮作用的地方。
SQL注入代表什么?
攻擊者使用 Web 應用程序中的輸入字段在服務器上運行任意查詢(注入)。因此,攻擊過程稱為 SQL 注入或 SQLi 攻擊。
他們可以訪問不打算顯示的信息。這些注入攻擊被 OWASP Top 10 歸類為“高影響嚴重性”。
是什么導致 SQLi?
SQLi 的根本原因通常是未能正確清理用戶輸入。當應用程序允許用戶在未經適當驗證的情況下輸入 SQL 語句時,攻擊者可以使用其他命令制作 SQL 查詢。它會導致未經授權的訪問、數據修改或其他惡意行為。
例如,攻擊者可以通過編寫始終返回 true 的 SQL 查詢來使用 SQL 注入來繞過身份驗證機制。它允許他們在沒有有效用戶名和密碼的情況下登錄。或者他們可以使用 SQL 注入來修改存儲在數據庫中的數據、竊取敏感數據或執行其他惡意操作。
SQL注入如何工作?
下面是一個示例來說明 SQL 注入的工作原理:
假設我們有一個帶有 SQL 數據庫的網站來存儲用戶信息。該網站有一個登錄表單,用戶可以在其中輸入用戶名和密碼。該網站的代碼可能如下所示:
$password = $_POST['密碼'];
$sql = “SELECT * FROM users WHERE username='$username' AND password='$password'”;
$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) > 0) {
// 用戶已成功登錄
} else {
// 無效的用戶名或密碼
}
在這段代碼中,用戶的輸入被直接插入到 SQL 語句中。如果用戶輸入用戶名,如 admin'–,則 SQL 語句變為:
SELECT * FROM users WHERE username='admin'–' AND password=”
雙破折號(–)是SQL中的注釋符,表示忽略后面的所有內容。這允許攻擊者繞過密碼檢查并以管理員身份登錄。
攻擊使用常見的 SQL 注入命令嘗試 SQLi 的不同變體,以查看數據庫執行了哪些命令。
基于此,他們不斷執行 SQLi 攻擊以訪問所需的信息。他們可能會在收集到他們需要的東西后停止,或者繼續回來執行他們的命令,直到這些漏洞存在。
SQL 注入攻擊的類型有哪些?

基于錯誤的 SQL 注入
基于錯誤的 SQL 注入是一種攻擊,惡意用戶使用惡意 SQL 查詢來獲得某種錯誤或確認他們的輸入存在問題。
它通常是關于數據庫語法中的規則。然后他們可以使用這些信息從數據庫中提取信息,例如密碼或個人銀行賬戶。
如何檢測基于錯誤的 SQL 注入?
攻擊者可以執行的 SQL 命令類型非常多,而且它們都非常難以預測。
以下是一些示例:單引號、雙引號或 SQL 運算符,如 AND、OR 和 NOT
例如:
錯誤消息向攻擊者致意:“你的 SQL 語法有錯誤;查看與您的 MySQL 服務器版本對應的手冊,了解在 ''VALUE'' 附近使用的正確語法。
錯誤消息為他提供了重要信息,例如:
- 數據庫用作MySQL
- 語法錯誤是雙引號
- 導致錯誤的地方在參數的末尾
基于聯合的 SQL 注入
在這種類型的 SQL 注入中,攻擊者試圖在“UNION”運算符的幫助下利用漏洞。
UNION 運算符用于組合 2 個表或同時執行 2 個選擇查詢。在聯合運算符中,它們會刪除我們嘗試同時執行的重復行或列。
基于聯合的 SQL 注入示例
假設我們有一個 Web 應用程序,它接受用戶的輸入并構建如下 SQL 查詢:
用戶輸入沒有經過適當的過濾,因此攻擊者可以注入他們自己的 SQL 代碼。例如,他們可以輸入以下值作為他們的名字:
這將導致執行以下 SQL 查詢:
注入字符串末尾的 — 是一個注釋符號,它注釋掉了原始查詢的其余部分。因此,生成的查詢將等效于:
UNION SELECT password, NULL, NULL FROM 用戶
此查詢將返回一個包含用戶名、電子郵件和電話號碼的表,以及一個包含用戶表中所有密碼的表。然后,攻擊者可以使用此信息進一步破壞系統。
SQL 盲注
Blind SQLi 是一種 SQL 注入攻擊,攻擊者利用 Web 應用程序中的漏洞從數據庫中提取敏感信息,而無法直接查看數據。這種類型的攻擊稱為“盲”攻擊,因為攻擊者看不到實際的數據庫內容。而是依賴于應用程序的響應來推斷信息。
SQL 盲注攻擊主要有兩種類型:
1. 基于布爾的 SQLi
2. 基于時間的 SQLi
基于布爾的 SQLi
在這種類型的 SQL 注入攻擊中,攻擊者發送一系列 SQL 查詢,根據注入的代碼是否成功執行來評估 true 或 false。然后,攻擊者可以使用應用程序的響應,通過構建復雜的查詢來探測特定信息,從而推斷出有關數據庫的信息。
基于布爾的 SQLi 示例:使用基于布爾的 SQLi 刪除用戶數據庫
它是如何工作的:一個常見的在線商店的 SQL 數據庫查詢可能是這樣的:
因此,在線商店中的產品 URL 可以是
http://www.exampleshop.com/items/items.asp?itemid=999 或 1=1。
SQL查詢可以是
一永遠等于一。這只是一個基本的數學事實,無論您身在何處都適用。SQL 查詢返回數據庫中的所有產品名稱和描述,即使是那些您無權訪問的產品。
基于時間的 SQLi
這種攻擊涉及注入一個旨在導致應用程序響應延遲的查詢。通過測量應用程序響應查詢所需的時間,攻擊者可以確定查詢是否成功。當攻擊者沒有來自應用程序的答案(錯誤/輸出),因為輸入驗證已被清理時,此技術很有用。
基于時間的 SQL 注入示例
例如,假設 Web 應用程序上有一個登錄表單,它使用 SQL 查詢來檢查用戶的憑據是否有效。查詢可能看起來像這樣:
要執行盲目 SQLi 攻擊,攻擊者可以注入如下查詢:
如果條件“1=1”為真,此查詢將使應用程序休眠 10 秒。攻擊者可以通過測量應用程序響應此查詢所花費的時間來確定條件是真還是假。
如果響應需要 10 秒,則攻擊者知道條件為真,應用程序容易受到盲目 SQLi 的攻擊。如果響應是立即的,攻擊者就知道條件是錯誤的。一旦攻擊者確認盲 SQLi 是可能的,他們就可以開始注入更復雜的查詢以從數據庫中提取敏感信息。
SQL 注入是如何由機器人驅動的?
- 自動掃描:機器人可以被編程為自動掃描許多網站,尋找可以被 SQL 注入攻擊利用的漏洞。一旦識別出易受攻擊的網站,機器人就可以嘗試使用一組預定義的 SQL 注入有效負載來利用該漏洞。
- 暴力攻擊:機器人也可用于對 Web 表單(例如登錄頁面或搜索框)進行暴力攻擊,以嘗試將 SQL 代碼注入應用程序。機器人可以使用不同的技術(例如字典攻擊或模糊測試)來生成不同的有效負載并將它們提交給應用程序以找到易受攻擊的入口點。
- 自動利用:一旦確定易受攻擊的入口點,機器人就可以自動注入惡意 SQL 代碼并從數據庫中提取數據。
僵尸程序可以使用不同的技術,例如 SQL 盲注或基于錯誤的 SQL 注入,從數據庫中提取敏感數據。總的來說,機器人可用于自動化識別和大規模利用 SQL 注入漏洞的過程。它使攻擊者更容易破壞許多網站并提取敏感數據。這就是為什么實施適當的安全措施以防止 SQL 注入攻擊很重要的原因。
注入攻擊的影響是什么?
- 竊取敏感數據:攻擊者可以使用 SQL 注入從數據庫中提取敏感數據,例如用戶名、密碼、信用卡號或個人信息。
- 修改或刪除數據:攻擊者可以使用SQL注入修改或刪除數據庫中的數據,從而導致數據丟失或損壞。
- 控制系統:攻擊者可以使用 SQL 注入獲得管理訪問權限,從而允許他們執行進一步的攻擊、安裝惡意軟件或將系統用于惡意目的。
SQL 注入攻擊的潛在成本甚至更高。經濟損失可能是直接的經濟損失,例如遭受攻擊后恢復系統和數據的成本。間接損失包括因業務運營中斷而造成的收入損失。此外,企業還可能因注入攻擊導致的數據泄露而面臨經濟處罰或法律訴訟。這尤其會損害處理敏感信息的企業,例如金融機構或醫療保健提供者。
此外,聲譽受損可能是長期的且難以恢復,從而對公司未來的增長和盈利能力產生負面影響。常見的 SQL 注入攻擊會導致知識丟失或拒絕訪問。然而,多年來,黑客將這些攻擊與不充分的身份驗證、DNS 劫持、XSS 和DDoS 攻擊相結合,造成了巨大的經濟損失和絕對主機接管。停機會導致收入損失和客戶失望,進一步損害企業聲譽。
歷史上最臭名昭著的 SQLi 攻擊
- Heartland Payment Systems:??2010 年 3 月,Albert Gonzalez 被判處 20 年徒刑。他將自己的代碼安裝到 Heartland Payment Systems 的信用卡服務器中,并竊取了 1.3 億個信用卡號碼。該公司的攻擊成本約為 1200 萬美元。
- 索尼 PlayStation 網絡黑客攻擊:??2011 年,索尼 PlayStation 網絡 (PSN) 遭到黑客攻擊,導致 7700 萬用戶的個人信息丟失。據報道,這次黑客攻擊是 SQL 注入攻擊的結果。攻擊者能夠訪問敏感信息,例如用戶姓名、地址和信用卡號。
- Yahoo Hack:??2012 年 7 月,雅虎語音用戶的 453,000 個電子郵件地址和密碼被泄露。憑據以未加密的方式存儲。黑客通過執行 SQL 注入攻擊竊取了數據。
- Target 數據泄露:??2013 年,Target Corporation 成為大規模數據泄露的受害者,影響了 4000 萬客戶。專家聲稱服務器受到了 SQL 注入攻擊。
- Drupal SQL 注入:??2014 年 10 月,Drupal 宣布其高度易受攻擊。缺乏用戶輸入清理導致 SQL 注入漏洞。從 7.0 到 7.31 的 Drupal 核心版本容易受到攻擊。
- Kaseye 勒索軟件攻擊:??2021 年 7 月,一個名為 REvil 的臭名昭著的組織影響了 Kaseya 管理的 1500 多家企業。黑客遠程利用了 Kaseya VSA 服務器的 SQL 漏洞。
- WooCommerce?未經身份驗證的 SQL 注入:??2021 年 7 月,WooCommerce 披露其多個功能插件和軟件版本存在 SQL 注入漏洞;他們注意到在那段時間發生了幾次安全攻擊。
如何防范SQL注入攻擊?
連續掃描和滲透測試
持續的 Web 應用程序掃描涉及定期運行自動漏洞掃描工具,以識別和評估系統中的任何潛在漏洞。滲透測試,也稱為“筆測試”,涉及模擬對系統的攻擊以識別和利用漏洞。通過定期執行這些測試,組織可以在攻擊者利用它們之前快速識別并解決任何漏洞。開發人員可以遵循最佳實踐指南并使用帶有參數化輸入的準備好的語句來防止 SQL 注入攻擊。
限制權限
限制權限是防止SQL注入攻擊影響的另一個重要措施。這涉及限制用戶和應用程序對數據庫及其組件的訪問和權限。這樣做會限制潛在的攻擊面,并使攻擊者更難利用漏洞。限制權限的一種方法是使用最小權限原則。它涉及僅向用戶和應用程序提供執行其任務所需的最低訪問權限和權限。這可以通過為不同的角色和職責創建單獨的用戶帳戶來完成。并且還通過限制這些帳戶對特定數據庫對象和操作的權限。另一種限制權限的方法是使用安全框架,例如基于角色的訪問控制 (RBAC)。它允許您定義用戶角色并分配特定權限。簡而言之,限制權限可以減少潛在的攻擊面,并使攻擊者更難利用漏洞。
使用查詢參數
動態查詢給安全專業人員帶來了很多麻煩。他們必須處理每個應用程序中的可變漏洞,這些漏洞只會隨著更新和更改而變得更加嚴重。建議準備參數化查詢。查詢參數是 SQL 查詢中的占位符,其中填充了來自用戶輸入或其他來源的值。使用查詢參數,您可以將用戶輸入與 SQL 查詢分開,使攻擊者更難注入惡意代碼。
以下是使用查詢參數的 SQL 查詢示例:
$password = $_POST['密碼'];
$query = “SELECT * FROM users WHERE username = :username AND password = :password”;
$stmt = $pdo->準備($query);
$stmt = bindParam(':用戶名', $用戶名);
$stmt->bindParam(':密碼', $密碼);
$stmt->執行();
在此示例中,使用查詢參數 :username 和 :password 將 SQL 查詢與用戶輸入分開。然后將這些參數的值分別傳遞給 bindParam() 函數,該函數在執行查詢之前將值綁定到參數。這些查詢簡單、易于編寫,并且只有在 SQL 代碼中的每個參數都被明確定義時才會通過。這樣,您的信息會隨武器一起提供,以區分代碼和信息輸入。
使用 Web 應用程序防火墻
大多數組織都會遇到過時的代碼、缺乏用于測試和進行更改的資源、不了解應用程序安全性以及應用程序中的頻繁更新等問題。對于這些,Web 應用程序保護是最好的解決方案。可以部署托管 Web 應用程序防火墻 (WAF) 以立即緩解此類?攻擊。?它可以在惡意流量到達 Web 應用程序之前檢測并阻止它。WAF 可以配置為檢測和阻止已知的 SQL 注入負載。
WAF 可以分析傳入流量的行為并查找指示 SQL 注入攻擊的模式。例如,它可以查找在短時間內重復提交 SQL 代碼的嘗試或異常活動。它包含自定義策略以阻止不符合應用程序安全策略的流量。這樣,您就不必手動查找漏洞并在事后修復問題。即使代碼更改很小,引入注入問題也很常見。因為此類更改可能不會在開發周期中經過全面的安全審查流程。當無法及時修復檢測到的漏洞代碼時,?部署后 可以使用WAF進行虛擬補丁。