什麼是 SQL 注入?

使用 SQL 資料隱碼攻擊,攻擊者可以在受害者的 SQL 資料庫上執行未經授權的資料庫命令。

學習目標

閱讀本文後,您將能夠:

  • 定義 SQL 資料隱碼攻擊
  • 說明 SQL 資料隱碼攻擊的運作方式
  • 瞭解如何防禦 SQL 資料隱碼攻擊
  • 探索複合的 SQLI 攻擊

相關內容


想要繼續瞭解嗎?

訂閱 TheNET,這是 Cloudflare 每月對網際網路上最流行見解的總結!

請參閱 Cloudflare 的隱私權政策,了解我們如何收集和處理您的個人資料。

複製文章連結

什麼是 SQL 資料隱碼攻擊 (SQi)?

結構化查詢語言 (SQL*) 插入是用於修改或從 SQL 資料庫擷取資料的代碼插入技術。透過將專門的 SQL 陳述式插入輸入欄位,攻擊者就能執行命令,以便從資料庫擷取資料、銷毀敏感性資料或執行其他操縱行為。

透過正確執行 SQL 命令,未經授權的使用者可以偽造特權更高的使用者的身分,使自己或其他人成為資料庫管理員,篡改現有資料、修改交易和餘額以及擷取和/或銷毀所有伺服器資料。

在現代運算中,SQL 資料隱碼攻擊通常是透過將惡意 SQL 查詢傳送到由網站或服務提供的 API 端點而在網際網路上發生的(下文會詳細介紹)。在最嚴重的形式下,SQL 資料隱碼攻擊可讓攻擊者獲得對電腦的 root 存取權限,完全掌握控制權。

*SQL 是用於維護大多數資料庫的程式設計語言。

SQL 資料隱碼攻擊如何運作?

想像一個法庭,一個名叫 Bob 的男子受審,他即將在法官面前出庭。在庭審前填寫文書時,Bob 將自己的名字寫成「Bob 可以自由離開」。當法官審理其案件並大聲讀出「下面傳喚的人是『Bob 可以自由離開』」時,法警放開 Bob,因為法官說他可以自由離開了。

儘管 SQLi 的各個變體略有不同,但核心漏洞本質上是相同的:本應為特定類型的資料(例如數字)保留的 SQL 查詢欄位傳遞了意外的資訊(例如命令)。該命令在執行時會超出預期的範圍,從而允許可能有害的行為。查詢欄位通常由輸入網頁表單中的資料填充。

讓我們來看看正常和惡意 SQL 陳述式之間的簡單比較:

正常的 SQL 查詢:

在此正常 SQL 查詢中,studentId 字串傳遞到 SQL 陳述式中。目的是在學生清單中查找與輸入的 studentId 相匹配的學生。找到後,學生的記錄將被傳回。簡而言之,命令說「去找到這個使用者並給我他的資料」。

代碼可能看起來像這樣:

studentId = getRequestString("studentId");
lookupStudent  = "SELECT * FROM students WHERE studentId = " + studentId
   

如果學生在標有「請輸入您的學生 ID 號碼」的網頁表格中輸入學生 ID 117,

正常表單欄位

產生的 SQL 查詢將如下所示:

SELECT * FROM students WHERE studentId = 117;

此命令將傳回具有特定 studentId 的學生的記錄,這符合編寫 API 的開發人員的期望。

SQL 資料隱碼攻擊查詢:

在此範例中,攻擊者在輸入欄位中輸入 SQL 命令或條件邏輯,他輸入的學生 ID 編號為:

SQL 資料隱碼攻擊表單欄位範例

通常查詢會在資料庫表中搜尋匹配的 ID,現在它會查找 ID 或測試 1 是否等於 1。如您所料,該陳述式對欄中的每個學生始終為 true,結果,資料庫會將學生表格中的所有資料傳回給進行查詢的攻擊者。

SELECT * FROM students WHERE studentId = 117 OR 1=1;
SQL 資料隱碼攻擊資訊圖

SQLi 的運作原理是針對易受攻擊的應用程式程式設計介面 (API)。在這種情況下,API 是伺服器接收和回應請求的軟體介面。

有一些常用的工具允許惡意行為者自動搜尋網站以查找表單,然後嘗試輸入各種 SQL 查詢,這可能產生網站的軟體開發人員未預期的回應,從而讓他們資料庫的漏洞。

SQL 注入很容易實作,有趣的是,如果採取適當的開發做法,它也很容易防止。現實情況比較複雜,因為期限緊迫、開發人員缺乏經驗以及遺留代碼等情況常常導致代碼品質和安全性作法參差不齊。有權存取資料庫的網站上如果有任何表格或 API 端點上有一個易受攻擊欄位,就足以形成漏洞。

如何防止 SQL 資料隱碼攻擊?

有許多方法可以減少由於 SQL 資料隱碼攻擊而導致資料外洩的風險。最佳做法是採用多種策略。我們來探索一些比較常見的實作:

  • 使用準備好的陳述式(帶有參數化查詢):這種清理資料庫輸入的方法會迫使開發人員先定義所有 SQL 代碼,然後僅將特定參數傳遞給 SQL 查詢;輸入的資料明確地給出有限範圍,無法擴展。這使資料庫可以區分輸入的資料和要執行的代碼,而不論輸入欄位中提供的資料類型如何。一些物件關係對應 (ORM) 庫通常用於此目的,因為某些版本會自動清理資料庫輸入。
  • 對所有使用者提供的輸入進行轉義:編寫 SQL 時,特定字元或單詞具有特定含義。例如,「*」字元表示「任意」,而單詞「OR」表示條件性。為了避免使用者意外地或惡意地將這些字元輸入資料庫的 API 請求中,可以對使用者提供的輸入進行轉義。對字元轉義是告訴資料庫不要將其剖析為命令或條件,而是將其視為文字輸入。
  • 使用儲存的程序:儘管儲存的程序本身並不是一種可靠的安全性策略,但它有助於限制與 SQL 資料隱碼攻擊相關的風險。透過適當地限制執行 SQL 查詢的資料庫帳戶的權限,即使容易受到 SQL 資料隱碼攻擊的非強健應用程式代碼也將缺少操縱無關資料庫表格所必需的權限。儲存的程序還可以檢查輸入參數的類型,以防止輸入的資料不符合該欄位設計接收的類型。在靜態查詢不足的情況下,通常應避免使用儲存的程序。
  • 實施最低權限:通常,在網站需要使用動態 SQL 的所有情況下,必須將權限限制為執行相關查詢所需的最窄範圍,從而降低 SQL 資料隱碼攻擊的風險。最明顯的情況就是管理帳戶在任何情況下都不應由於來自未授權請求的 API 呼叫而執行 SQL 命令。儲存的程序最適合用於靜態查詢,而實施最低權限則有助於降低動態 SQL 查詢的風險。

什麼是複合 SQL 資料隱碼攻擊?

為了規避安全措施,聰明的攻擊者有時會對目標網站實作多媒介攻擊。儘管單次的攻擊可以緩解,但它也可能成為資料庫管理員和資訊安全團隊關注的焦點。DDoS 攻擊DNS 劫持和其他破壞方法有時被用作干擾手段,用於掩蓋 SQL 資料隱碼攻擊的實施。因此,全面的威脅緩解策略才能提供最廣泛的保護。Cloudflare 的 Web 應用程式防火牆DDoS 緩解DNS 安全是整體安全性策略的核心元素。