使用 SQL 資料隱碼攻擊,攻擊者可以在受害者的 SQL 資料庫上執行未經授權的資料庫命令。
閱讀本文後,您將能夠:
相關內容
訂閱 TheNET,這是 Cloudflare 每月對網際 網路上最流行見解的總結!
複製文章連結
結構化查詢語言 (SQL*) 插入是用於修改或從 SQL 資料庫擷取資料的代碼插入技術。透過將專門的 SQL 陳述式插入輸入欄位,攻擊者就能執行命令,以便從資料庫擷取資料、銷毀敏感性資料或執行其他操縱行為。
透過正確執行 SQL 命令,未經授權的使用者可以偽造特權更高的使用者的身分,使自己或其他人成為資料庫管理員,篡改現有資料、修改交易和餘額以及擷取和/或銷毀所有伺服器資料。
在現代運算中,SQL 資料隱碼攻擊通常是透過將惡意 SQL 查詢傳送到由網站或服務提供的 API 端點而在網際網路上發生的(下文會詳細介紹)。在最嚴重的形式下,SQL 資料隱碼攻擊可讓攻擊者獲得對電腦的 root 存取權限,完全掌握控制權。
*SQL 是用於維護大多數資料庫的程式設計語言。
想像一個法庭,一個名叫 Bob 的男子受審,他即將在法官面前出庭。在庭審前填寫文書時,Bob 將自己的名字寫成「Bob 可以自由離開」。當法官審理其案件並大聲讀出「下面傳喚的人是『Bob 可以自由離開』」時,法警放開 Bob,因為法官說他可以自由離開了。
儘管 SQLi 的各個變體略有不同,但核心漏洞本質上是相同的:本應為特定類型的資料(例如數字)保留的 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 命令或條件邏輯,他輸入的學生 ID 編號為:
通常查詢會在資料庫表中搜尋匹配的 ID,現在它會查找 ID 或測試 1 是否等於 1。如您所料,該陳述式對欄中的每個學生始終為 true,結果,資料庫會將學生表格中的所有資料傳回給進行查詢的攻擊者。
SELECT * FROM students WHERE studentId = 117 OR 1=1;
SQLi 的運作原理是針對易受攻擊的應用程式程式設計介面 (API)。在這種情況下,API 是伺服器接收和回應請求的軟體介面。
有一些常用的工具允許惡意行為者自動搜尋網站以查找表單,然後嘗試輸入各種 SQL 查詢,這可能產生網站的軟體開發人員未預期的回應,從而讓他們資料庫的漏洞。
SQL 注入很容易實作,有趣的是,如果採取適當的開發做法,它也很容易防止。現實情況比較複雜,因為期限緊迫、開發人員缺乏經驗以及遺留代碼等情況常常導致代碼品質和安全性作法參差不齊。有權存取資料庫的網站上如果有任何表格或 API 端點上有一個易受攻擊欄位,就足以形成漏洞。
有許多方法可以減少由於 SQL 資料隱碼攻擊而導致資料外洩的風險。最佳做法是採用多種策略。我們來探索一些比較常見的實作:
為了規避安全措施,聰明的攻擊者有時會對目標網站實作多媒介攻擊。儘管單次的攻擊可以緩解,但它也可能成為資料庫管理員和資訊安全團隊關注的焦點。DDoS 攻擊、DNS 劫持和其他破壞方法有時被用作干擾手段,用於掩蓋 SQL 資料隱碼攻擊的實施。因此,全面的威脅緩解策略才能提供最廣泛的保護。Cloudflare 的 Web 應用程式防火牆、DDoS 緩解和 DNS 安全是整體安全性策略的核心元素。