SQL注入如何工作?注入攻擊的影響是什么?

      您是否意識(shí)到 SQL 注入漏洞的威脅越來越大?2022 年第四季度,AppTrana 阻止了 1,111,548 次此類攻擊。在短短三個(gè)月內(nèi)阻止了超過一百萬(wàn)次 SQL 注入攻擊,很明顯 Web 應(yīng)用程序正處于圍攻之中。

      現(xiàn)在如何保持領(lǐng)先地位并保護(hù)您的業(yè)務(wù)?這是了解此OWASP 前 10 大漏洞以及如何防止 SQL 注入攻擊的指南。什么是數(shù)據(jù)庫(kù)和SQL?數(shù)據(jù)庫(kù)是一組描述的表,可以從中訪問或存儲(chǔ)數(shù)據(jù)。數(shù)據(jù)庫(kù)應(yīng)用程序需要前端和數(shù)據(jù)庫(kù)之間的通信媒介。這就是 SQL 發(fā)揮作用的地方。

      SQL注入如何工作?注入攻擊的影響是什么?-南華中天

      SQL注入代表什么?

      結(jié)構(gòu)化查詢語(yǔ)言 (SQL) 開發(fā)于 1970 年代,是一種用于從數(shù)據(jù)庫(kù)訪問和操作數(shù)據(jù)的語(yǔ)言。應(yīng)用程序可以使用 SQL 語(yǔ)句與數(shù)據(jù)庫(kù)通信。通過使用 SQL 語(yǔ)句,應(yīng)用程序可以執(zhí)行一些標(biāo)準(zhǔn)的 SQL 命令,例如“SELECT”、“UPDATE”、“INSERT”、“DELETE”、“CREATE”和“DROP”。

      攻擊者使用 Web 應(yīng)用程序中的輸入字段在服務(wù)器上運(yùn)行任意查詢(注入)。因此,攻擊過程稱為 SQL 注入或 SQLi 攻擊。

      他們可以訪問不打算顯示的信息。這些注入攻擊被 OWASP Top 10 歸類為“高影響嚴(yán)重性”。

      是什么導(dǎo)致 SQLi?

      SQLi 的根本原因通常是未能正確清理用戶輸入。當(dāng)應(yīng)用程序允許用戶在未經(jīng)適當(dāng)驗(yàn)證的情況下輸入 SQL 語(yǔ)句時(shí),攻擊者可以使用其他命令制作 SQL 查詢。它會(huì)導(dǎo)致未經(jīng)授權(quán)的訪問、數(shù)據(jù)修改或其他惡意行為。

      例如,攻擊者可以通過編寫始終返回 true 的 SQL 查詢來使用 SQL 注入來繞過身份驗(yàn)證機(jī)制。它允許他們?cè)跊]有有效用戶名和密碼的情況下登錄。或者他們可以使用 SQL 注入來修改存儲(chǔ)在數(shù)據(jù)庫(kù)中的數(shù)據(jù)、竊取敏感數(shù)據(jù)或執(zhí)行其他惡意操作。

      SQL注入如何工作?

      下面是一個(gè)示例來說明 SQL 注入的工作原理:

      SQL注入如何工作?注入攻擊的影響是什么?-南華中天

      假設(shè)我們有一個(gè)帶有 SQL 數(shù)據(jù)庫(kù)的網(wǎng)站來存儲(chǔ)用戶信息。該網(wǎng)站有一個(gè)登錄表單,用戶可以在其中輸入用戶名和密碼。該網(wǎng)站的代碼可能如下所示:

      $用戶名 = $_POST['用戶名'];
      $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 語(yǔ)句中。如果用戶輸入用戶名,如 admin'–,則 SQL 語(yǔ)句變?yōu)椋?/p>

      SELECT * FROM users WHERE username='admin'–' AND password=”

      雙破折號(hào)(–)是SQL中的注釋符,表示忽略后面的所有內(nèi)容。這允許攻擊者繞過密碼檢查并以管理員身份登錄。

      攻擊使用常見的 SQL 注入命令嘗試 SQLi 的不同變體,以查看數(shù)據(jù)庫(kù)執(zhí)行了哪些命令。

      基于此,他們不斷執(zhí)行 SQLi 攻擊以訪問所需的信息。他們可能會(huì)在收集到他們需要的東西后停止,或者繼續(xù)回來執(zhí)行他們的命令,直到這些漏洞存在。

      SQL 注入攻擊的類型有哪些?

      SQL 注入預(yù)防和緩解的一大障礙是它涉及多種技術(shù)。以下是不同 SQL 注入類型的細(xì)分:SQL注入如何工作?注入攻擊的影響是什么?-南華中天

      基于錯(cuò)誤的 SQL 注入

      基于錯(cuò)誤的 SQL 注入是一種攻擊,惡意用戶使用惡意 SQL 查詢來獲得某種錯(cuò)誤或確認(rèn)他們的輸入存在問題。

      它通常是關(guān)于數(shù)據(jù)庫(kù)語(yǔ)法中的規(guī)則。然后他們可以使用這些信息從數(shù)據(jù)庫(kù)中提取信息,例如密碼或個(gè)人銀行賬戶。

      如何檢測(cè)基于錯(cuò)誤的 SQL 注入?

      攻擊者可以執(zhí)行的 SQL 命令類型非常多,而且它們都非常難以預(yù)測(cè)。

      以下是一些示例:?jiǎn)我?hào)、雙引號(hào)或 SQL 運(yùn)算符,如 AND、OR 和 NOT

      例如:

      http://demo.testfire.net/index.php?title=1’

      錯(cuò)誤消息向攻擊者致意:“你的 SQL 語(yǔ)法有錯(cuò)誤;查看與您的 MySQL 服務(wù)器版本對(duì)應(yīng)的手冊(cè),了解在 ''VALUE'' 附近使用的正確語(yǔ)法。

      錯(cuò)誤消息為他提供了重要信息,例如:

      • 數(shù)據(jù)庫(kù)用作MySQL
      • 語(yǔ)法錯(cuò)誤是雙引號(hào)
      • 導(dǎo)致錯(cuò)誤的地方在參數(shù)的末尾

      基于聯(lián)合的 SQL 注入

      在這種類型的 SQL 注入中,攻擊者試圖在“UNION”運(yùn)算符的幫助下利用漏洞。

      UNION 運(yùn)算符用于組合 2 個(gè)表或同時(shí)執(zhí)行 2 個(gè)選擇查詢。在聯(lián)合運(yùn)算符中,它們會(huì)刪除我們嘗試同時(shí)執(zhí)行的重復(fù)行或列。

      基于聯(lián)合的 SQL 注入示例

      假設(shè)我們有一個(gè) Web 應(yīng)用程序,它接受用戶的輸入并構(gòu)建如下 SQL 查詢:

      SELECT name, email, phone FROM users WHERE name = '[user_input]'

      用戶輸入沒有經(jīng)過適當(dāng)?shù)倪^濾,因此攻擊者可以注入他們自己的 SQL 代碼。例如,他們可以輸入以下值作為他們的名字:

      ' UNION SELECT password, NULL, NULL FROM users —

      這將導(dǎo)致執(zhí)行以下 SQL 查詢:

      SELECT name, email, phone FROM users WHERE name = ” UNION SELECT password, NULL, NULL FROM users –'

      注入字符串末尾的 — 是一個(gè)注釋符號(hào),它注釋掉了原始查詢的其余部分。因此,生成的查詢將等效于:

      SELECT name, email, phone FROM users WHERE name = ”
      UNION SELECT password, NULL, NULL FROM 用戶

      此查詢將返回一個(gè)包含用戶名、電子郵件和電話號(hào)碼的表,以及一個(gè)包含用戶表中所有密碼的表。然后,攻擊者可以使用此信息進(jìn)一步破壞系統(tǒng)。

      SQL 盲注

      Blind SQLi 是一種 SQL 注入攻擊,攻擊者利用 Web 應(yīng)用程序中的漏洞從數(shù)據(jù)庫(kù)中提取敏感信息,而無法直接查看數(shù)據(jù)。這種類型的攻擊稱為“盲”攻擊,因?yàn)楣粽呖床坏綄?shí)際的數(shù)據(jù)庫(kù)內(nèi)容。而是依賴于應(yīng)用程序的響應(yīng)來推斷信息。

      SQL 盲注攻擊主要有兩種類型:

      1. 基于布爾的 SQLi
      2. 基于時(shí)間的 SQLi

      基于布爾的 SQLi

      在這種類型的 SQL 注入攻擊中,攻擊者發(fā)送一系列 SQL 查詢,根據(jù)注入的代碼是否成功執(zhí)行來評(píng)估 true 或 false。然后,攻擊者可以使用應(yīng)用程序的響應(yīng),通過構(gòu)建復(fù)雜的查詢來探測(cè)特定信息,從而推斷出有關(guān)數(shù)據(jù)庫(kù)的信息。

      基于布爾的 SQLi 示例:使用基于布爾的 SQLi 刪除用戶數(shù)據(jù)庫(kù)

      它是如何工作的:一個(gè)常見的在線商店的 SQL 數(shù)據(jù)庫(kù)查詢可能是這樣的:

      從 Item WHERE ItemNumber = ItemNumber 中選擇 ItemName、ItemDescription

      因此,在線商店中的產(chǎn)品 URL 可以是

      http://www.exampleshop.com/items/items.asp?itemid=999 或 1=1。

      SQL查詢可以是

      從 ItemNumber = 999 或 1=1 的項(xiàng)目中選擇 ItemName、ItemDescription

      一永遠(yuǎn)等于一。這只是一個(gè)基本的數(shù)學(xué)事實(shí),無論您身在何處都適用。SQL 查詢返回?cái)?shù)據(jù)庫(kù)中的所有產(chǎn)品名稱和描述,即使是那些您無權(quán)訪問的產(chǎn)品。

      基于時(shí)間的 SQLi

      這種攻擊涉及注入一個(gè)旨在導(dǎo)致應(yīng)用程序響應(yīng)延遲的查詢。通過測(cè)量應(yīng)用程序響應(yīng)查詢所需的時(shí)間,攻擊者可以確定查詢是否成功。當(dāng)攻擊者沒有來自應(yīng)用程序的答案(錯(cuò)誤/輸出),因?yàn)檩斎腧?yàn)證已被清理時(shí),此技術(shù)很有用。

      基于時(shí)間的 SQL 注入示例

      例如,假設(shè) Web 應(yīng)用程序上有一個(gè)登錄表單,它使用 SQL 查詢來檢查用戶的憑據(jù)是否有效。查詢可能看起來像這樣:

      SELECT * FROM users WHERE username = 'admin' AND password = 'password123'

      要執(zhí)行盲目 SQLi 攻擊,攻擊者可以注入如下查詢:

      SELECT CASE WHEN (1=1) THEN pg_sleep(10) ELSE pg_sleep(0) END;

      如果條件“1=1”為真,此查詢將使應(yīng)用程序休眠 10 秒。攻擊者可以通過測(cè)量應(yīng)用程序響應(yīng)此查詢所花費(fèi)的時(shí)間來確定條件是真還是假。

      如果響應(yīng)需要 10 秒,則攻擊者知道條件為真,應(yīng)用程序容易受到盲目 SQLi 的攻擊。如果響應(yīng)是立即的,攻擊者就知道條件是錯(cuò)誤的。一旦攻擊者確認(rèn)盲 SQLi 是可能的,他們就可以開始注入更復(fù)雜的查詢以從數(shù)據(jù)庫(kù)中提取敏感信息。

      SQL 注入是如何由機(jī)器人驅(qū)動(dòng)的?

      SQL 注入攻擊可以通過幾種不同的方式由機(jī)器人驅(qū)動(dòng)。機(jī)器人可以被編程為自動(dòng)掃描網(wǎng)站的漏洞,然后嘗試使用 SQL 注入技術(shù)來利用它們。這里有些例子:

      • 自動(dòng)掃描:機(jī)器人可以被編程為自動(dòng)掃描許多網(wǎng)站,尋找可以被 SQL 注入攻擊利用的漏洞。一旦識(shí)別出易受攻擊的網(wǎng)站,機(jī)器人就可以嘗試使用一組預(yù)定義的 SQL 注入有效負(fù)載來利用該漏洞。
      • 暴力攻擊:機(jī)器人也可用于對(duì) Web 表單(例如登錄頁(yè)面或搜索框)進(jìn)行暴力攻擊,以嘗試將 SQL 代碼注入應(yīng)用程序。機(jī)器人可以使用不同的技術(shù)(例如字典攻擊或模糊測(cè)試)來生成不同的有效負(fù)載并將它們提交給應(yīng)用程序以找到易受攻擊的入口點(diǎn)。
      • 自動(dòng)利用:一旦確定易受攻擊的入口點(diǎn),機(jī)器人就可以自動(dòng)注入惡意 SQL 代碼并從數(shù)據(jù)庫(kù)中提取數(shù)據(jù)。

      僵尸程序可以使用不同的技術(shù),例如 SQL 盲注或基于錯(cuò)誤的 SQL 注入,從數(shù)據(jù)庫(kù)中提取敏感數(shù)據(jù)。總的來說,機(jī)器人可用于自動(dòng)化識(shí)別和大規(guī)模利用 SQL 注入漏洞的過程。它使攻擊者更容易破壞許多網(wǎng)站并提取敏感數(shù)據(jù)。這就是為什么實(shí)施適當(dāng)?shù)陌踩胧┮苑乐?SQL 注入攻擊很重要的原因。

      注入攻擊的影響是什么?

      SQL 注入攻擊的影響可能是深遠(yuǎn)的,并且可能因目標(biāo)而異。數(shù)據(jù)完整性和機(jī)密性泄露是最常見的后果。當(dāng)數(shù)據(jù)庫(kù)執(zhí)行惡意代碼時(shí),它可能允許攻擊者:

      • 竊取敏感數(shù)據(jù):攻擊者可以使用 SQL 注入從數(shù)據(jù)庫(kù)中提取敏感數(shù)據(jù),例如用戶名、密碼、信用卡號(hào)或個(gè)人信息。
      • 修改或刪除數(shù)據(jù):攻擊者可以使用SQL注入修改或刪除數(shù)據(jù)庫(kù)中的數(shù)據(jù),從而導(dǎo)致數(shù)據(jù)丟失或損壞。
      • 控制系統(tǒng):攻擊者可以使用 SQL 注入獲得管理訪問權(quán)限,從而允許他們執(zhí)行進(jìn)一步的攻擊、安裝惡意軟件或?qū)⑾到y(tǒng)用于惡意目的。

      SQL 注入攻擊的潛在成本甚至更高。經(jīng)濟(jì)損失可能是直接的經(jīng)濟(jì)損失,例如遭受攻擊后恢復(fù)系統(tǒng)和數(shù)據(jù)的成本。間接損失包括因業(yè)務(wù)運(yùn)營(yíng)中斷而造成的收入損失。此外,企業(yè)還可能因注入攻擊導(dǎo)致的數(shù)據(jù)泄露而面臨經(jīng)濟(jì)處罰或法律訴訟。這尤其會(huì)損害處理敏感信息的企業(yè),例如金融機(jī)構(gòu)或醫(yī)療保健提供者。

      此外,聲譽(yù)受損可能是長(zhǎng)期的且難以恢復(fù),從而對(duì)公司未來的增長(zhǎng)和盈利能力產(chǎn)生負(fù)面影響。常見的 SQL 注入攻擊會(huì)導(dǎo)致知識(shí)丟失或拒絕訪問。然而,多年來,黑客將這些攻擊與不充分的身份驗(yàn)證、DNS 劫持、XSS 和DDoS 攻擊相結(jié)合,造成了巨大的經(jīng)濟(jì)損失和絕對(duì)主機(jī)接管。停機(jī)會(huì)導(dǎo)致收入損失和客戶失望,進(jìn)一步損害企業(yè)聲譽(yù)。

      歷史上最臭名昭著的 SQLi 攻擊

      以下是近年來最著名的一些SQL攻擊,每個(gè)公司都必須知道:

      • Heartland Payment Systems:??2010 年 3 月,Albert Gonzalez 被判處 20 年徒刑。他將自己的代碼安裝到 Heartland Payment Systems 的信用卡服務(wù)器中,并竊取了 1.3 億個(gè)信用卡號(hào)碼。該公司的攻擊成本約為 1200 萬(wàn)美元。
      • 索尼 PlayStation 網(wǎng)絡(luò)黑客攻擊:??2011 年,索尼 PlayStation 網(wǎng)絡(luò) (PSN) 遭到黑客攻擊,導(dǎo)致 7700 萬(wàn)用戶的個(gè)人信息丟失。據(jù)報(bào)道,這次黑客攻擊是 SQL 注入攻擊的結(jié)果。攻擊者能夠訪問敏感信息,例如用戶姓名、地址和信用卡號(hào)。
      • Yahoo Hack:??2012 年 7 月,雅虎語(yǔ)音用戶的 453,000 個(gè)電子郵件地址和密碼被泄露。憑據(jù)以未加密的方式存儲(chǔ)。黑客通過執(zhí)行 SQL 注入攻擊竊取了數(shù)據(jù)。
      • Target 數(shù)據(jù)泄露:??2013 年,Target Corporation 成為大規(guī)模數(shù)據(jù)泄露的受害者,影響了 4000 萬(wàn)客戶。專家聲稱服務(wù)器受到了 SQL 注入攻擊。
      • Drupal SQL 注入:??2014 年 10 月,Drupal 宣布其高度易受攻擊。缺乏用戶輸入清理導(dǎo)致 SQL 注入漏洞。從 7.0 到 7.31 的 Drupal 核心版本容易受到攻擊。
      • Kaseye 勒索軟件攻擊:??2021 年 7 月,一個(gè)名為 REvil 的臭名昭著的組織影響了 Kaseya 管理的 1500 多家企業(yè)。黑客遠(yuǎn)程利用了 Kaseya VSA 服務(wù)器的 SQL 漏洞。
      • WooCommerce?未經(jīng)身份驗(yàn)證的 SQL 注入:??2021 年 7 月,WooCommerce 披露其多個(gè)功能插件和軟件版本存在 SQL 注入漏洞;他們注意到在那段時(shí)間發(fā)生了幾次安全攻擊。

      如何防范SQL注入攻擊?

      防止或減輕 SQL 注入攻擊是關(guān)于確保沒有任何字段容易受到無效輸入和應(yīng)用程序執(zhí)行的影響。手動(dòng)檢查網(wǎng)站上的每個(gè)頁(yè)面和每個(gè)應(yīng)用程序是不可能的。尤其是在更新頻繁,用戶友好性是重中之重的情況下。盡管如此,安全分析師和開發(fā)人員還是建議以下幾點(diǎn)確保您的數(shù)據(jù)庫(kù)在服務(wù)器內(nèi)受到良好保護(hù)。

      連續(xù)掃描和滲透測(cè)試

      持續(xù)的 Web 應(yīng)用程序掃描涉及定期運(yùn)行自動(dòng)漏洞掃描工具,以識(shí)別和評(píng)估系統(tǒng)中的任何潛在漏洞。滲透測(cè)試,也稱為“筆測(cè)試”,涉及模擬對(duì)系統(tǒng)的攻擊以識(shí)別和利用漏洞。通過定期執(zhí)行這些測(cè)試,組織可以在攻擊者利用它們之前快速識(shí)別并解決任何漏洞。開發(fā)人員可以遵循最佳實(shí)踐指南并使用帶有參數(shù)化輸入的準(zhǔn)備好的語(yǔ)句來防止 SQL 注入攻擊。

      限制權(quán)限

      限制權(quán)限是防止SQL注入攻擊影響的另一個(gè)重要措施。這涉及限制用戶和應(yīng)用程序?qū)?shù)據(jù)庫(kù)及其組件的訪問和權(quán)限。這樣做會(huì)限制潛在的攻擊面,并使攻擊者更難利用漏洞。限制權(quán)限的一種方法是使用最小權(quán)限原則。它涉及僅向用戶和應(yīng)用程序提供執(zhí)行其任務(wù)所需的最低訪問權(quán)限和權(quán)限。這可以通過為不同的角色和職責(zé)創(chuàng)建單獨(dú)的用戶帳戶來完成。并且還通過限制這些帳戶對(duì)特定數(shù)據(jù)庫(kù)對(duì)象和操作的權(quán)限。另一種限制權(quán)限的方法是使用安全框架,例如基于角色的訪問控制 (RBAC)。它允許您定義用戶角色并分配特定權(quán)限。簡(jiǎn)而言之,限制權(quán)限可以減少潛在的攻擊面,并使攻擊者更難利用漏洞。

      使用查詢參數(shù)

      動(dòng)態(tài)查詢給安全專業(yè)人員帶來了很多麻煩。他們必須處理每個(gè)應(yīng)用程序中的可變漏洞,這些漏洞只會(huì)隨著更新和更改而變得更加嚴(yán)重。建議準(zhǔn)備參數(shù)化查詢。查詢參數(shù)是 SQL 查詢中的占位符,其中填充了來自用戶輸入或其他來源的值。使用查詢參數(shù),您可以將用戶輸入與 SQL 查詢分開,使攻擊者更難注入惡意代碼。

      以下是使用查詢參數(shù)的 SQL 查詢示例:

      $用戶名 = $_POST['用戶名'];
      $password = $_POST['密碼'];
      $query = “SELECT * FROM users WHERE username = :username AND password = :password”;
      $stmt = $pdo->準(zhǔn)備($query);
      $stmt = bindParam(':用戶名', $用戶名);
      $stmt->bindParam(':密碼', $密碼);
      $stmt->執(zhí)行();

      在此示例中,使用查詢參數(shù) :username 和 :password 將 SQL 查詢與用戶輸入分開。然后將這些參數(shù)的值分別傳遞給 bindParam() 函數(shù),該函數(shù)在執(zhí)行查詢之前將值綁定到參數(shù)。這些查詢簡(jiǎn)單、易于編寫,并且只有在 SQL 代碼中的每個(gè)參數(shù)都被明確定義時(shí)才會(huì)通過。這樣,您的信息會(huì)隨武器一起提供,以區(qū)分代碼和信息輸入。

      使用 Web 應(yīng)用程序防火墻

      大多數(shù)組織都會(huì)遇到過時(shí)的代碼、缺乏用于測(cè)試和進(jìn)行更改的資源、不了解應(yīng)用程序安全性以及應(yīng)用程序中的頻繁更新等問題。對(duì)于這些,Web 應(yīng)用程序保護(hù)是最好的解決方案。可以部署托管 Web 應(yīng)用程序防火墻 (WAF) 以立即緩解此類?攻擊。?它可以在惡意流量到達(dá) Web 應(yīng)用程序之前檢測(cè)并阻止它。WAF 可以配置為檢測(cè)和阻止已知的 SQL 注入負(fù)載。

      WAF 可以分析傳入流量的行為并查找指示 SQL 注入攻擊的模式。例如,它可以查找在短時(shí)間內(nèi)重復(fù)提交 SQL 代碼的嘗試或異常活動(dòng)。它包含自定義策略以阻止不符合應(yīng)用程序安全策略的流量。這樣,您就不必手動(dòng)查找漏洞并在事后修復(fù)問題。即使代碼更改很小,引入注入問題也很常見。因?yàn)榇祟惛目赡懿粫?huì)在開發(fā)周期中經(jīng)過全面的安全審查流程。當(dāng)無法及時(shí)修復(fù)檢測(cè)到的漏洞代碼時(shí),?部署后 可以使用WAF進(jìn)行虛擬補(bǔ)丁。