朱振南 金京犬


關鍵詞:SQL注入漏洞;SQL注入攻擊;SQL注入檢測;SQL注入防御
0 引言
OWASP TOP 10(Open Web Application SecurityProject) 對Web應用程序最常見、最危險的十大安全漏洞進行了綜合總結,在2013年版、2017年版和2021 年版中,SQL注入攻擊分別被列為第1、1、3位。這份榜單的高排位充分說明了SQL注入攻勢的嚴重性和普遍性。SQL注入漏洞作為一種典型的Web安全高危漏洞,攻擊者能夠利用未經授權的SQL查詢執行惡意操作。這種漏洞的后果包括嚴重的數據泄露、數據篡改、系統癱瘓以及用戶身份盜用等風險。全球范圍內,SQL注入攻擊已經導致了巨大的經濟損失和隱私泄露。所以,針對檢測和防御SQL注入攻擊研究已成為網絡安全研究領域的重要課題。
1 SQL 注入關鍵詞
在SQL注入攻擊中,攻擊者可以通過在用戶輸入中插入特殊的SQL代碼,來改變原始查詢的意圖,執行未經授權的操作,獲取敏感數據或對數據庫進行惡意操作。SQL注入攻擊中常見的用于構造惡意SQL 語句的關鍵詞[1]如表1所示。
2 SQL 注入攻擊原理
SQL注入攻擊[2]是通過向Web應用程序傳遞惡意構造的SQL查詢,來繞過應用程序的輸入驗證,從而執行非授權的數據庫操作。下面以一個簡單的例子來說明一下SQL注入攻擊原理。
假設有網站的搜索功能,用戶可以將自己感興趣的關鍵詞輸入搜索框進行搜索。Search功能的實現,使用了如下 SQL 查詢語句:
3 SQL 注入實現方式
攻擊者通過在網站的輸入字段中插入惡意的SQL代碼,從而繞過應用程序的安全驗證,對數據庫進行非法操作,常見的SQL注入方式有以下幾種。
3.1 堆疊查詢注入
攻擊者通過在一個SQL查詢中嵌入多個查詢語句,以執行額外的惡意操作,這種注入方式可以利用數據庫的批處理功能,執行多個SQL語句。假定有用戶登錄功能,用戶通過輸入用戶名和密碼的方式進行登錄校驗。攻擊者可以構造惡意的輸入,例如在用戶名字段中輸入 ′ OR 1=1; DROP TABLE users; --。當這個輸入被拼接到SQL查詢中時,它會變成:
SELECT * FROM users WHERE username = ′′ OR1=1; DROP TABLE users; --′ AND password = ′輸入的密碼′;
這個惡意的輸入利用了堆疊查詢注入的特性,將兩個SQL語句合并在一起。第一個語句是一個無條件成立的條件,使得查詢的結果集不為空;第二個語句是一個危險的操作,刪除了users表。因此,這個注入攻擊成功地刪除了users表。
3.2 基于聯合查詢的注入
攻擊者通過構造惡意的SQL語句,利用UNION關鍵字,將惡意查詢與原始查詢的結果合并后進行攻擊。如在搜索框中輸入‘UNION SELECT username,password FROM users; --。當這一輸入被拼接到SQL 查詢中時,它會變成:
SELECT * FROM 表名稱 WHERE name LIKE‘ % 關鍵字% UNION SELECT username, password FROMusers; --′;
這個惡意的輸入利用了聯合查詢注入的特性,將原來的查詢結果與攻擊者構造的查詢結果合并在一起。這樣,攻擊者就能獲得users表格中的用戶名和密碼等敏感資料。
3.3 基于函數報錯的注入
攻擊者通過updatexml()、extractvalue()、floor()等函數運行的時候,構造一些報錯點,可以展示出數據庫在執行時產生錯誤信息,從而從報錯信息中獲取設定信息。假設有一個用戶注冊的功能,攻擊者構造惡意的輸入:
Admin01or updatexml(1, concat(0x7e, database()),0) or。當這個輸入被拼接到SQL 查詢中時,它會變成:
INSERT INTO users (字段1, 字段2,……,字段n)VALUES ‘( admin01or updatexml(1, concat(0x7e, data?base()),0) or,字段2,……,字段n);
這個惡意的輸入利用了錯誤的注入特性,使得SQL語句執行時產生錯誤,從而繞過了正常的注冊流程,并獲取到了當前網站的所使用的數據庫名。
3.4 基于真假盲注的注入
開發者在后臺使用了錯誤消息屏蔽方法屏蔽了報錯,此時無法根據報錯信息來進行注入的判斷,在這種情況下,攻擊者利用盲注獲取設定的信息,真假盲注注入是利用數據庫的布爾邏輯判斷結果來獲取敏感信息。攻擊者在用戶登錄框中輸入 ′ OR 1=1AND ′A′=′A。當這個輸入被拼接到SQL查詢中時,它會變成:
SELECT * FROM users WHERE username = ′′ OR1=1 AND ′A′=′A′ AND password = ′輸入密碼′;
這個惡意的輸入利用了布爾邏輯判斷的特性,使得整個條件永遠成立。所以,通過這種注入攻擊,繞過登錄驗證,無論用戶輸入的密碼是否正確。
3.5 基于時間盲注的注入
攻擊者通過構造惡意的SQL語句,利用數據庫的時間延遲函數來判斷注入是否成功,從而獲取敏感信息。攻擊者在搜索框中構造惡意輸入′OR SLEEP(5);--。當它被拼接到原SQL查詢中時,它會變成:
SELECT * FROM 表名稱WHERE name LIKE ′% 關鍵字%′ OR SLEEP(5); --′;
這個惡意的輸入利用了時間延遲函數SLEEP()的特性,使得查詢語句執行時會暫停5秒鐘,攻擊者通過觀察所查詢的反應時間來判斷是否注入成功。
3.6 基于存儲過程的注入
基于存儲過程的注入[3]是攻擊者通過構造惡意的SQL語句,利用數據庫中的存儲過程進行額外的惡意運算。攻擊者能夠通過存儲過程執行系統命令或訪問敏感數據。假設有一個用戶注冊的功能,攻擊者在注冊用戶名字段中輸入 ′; DROP TABLE users; --。當這個輸入被拼接到SQL查詢中時,它會變成:
這個惡意的輸入利用了存儲過程的執行方式,將惡意的 SQL 語句作為參數傳遞給存儲過程。這樣,攻擊者成功地執行了危險的操作,刪除了users表。
3.7 基于函數的注入
基于函數的注入[4] 是攻擊者通過構造惡意的SQL 語句,利用數據庫中的函數來執行額外的惡意操作。攻擊者能夠執行系統命令,或利用數據庫功能訪問敏感資料。攻擊者在搜索框中構造惡意的輸入′;SELECT @@VERSION; --。當這個輸入被拼接到SQL查詢中時,它會變成:
SELECT * FROM products WHERE name LIKE ′% 關鍵字%′; SELECT @@VERSION; --′
這個惡意的輸入利用了數據庫函數@@VERSION,返回數據庫的版本信息。通過這個注入攻擊,攻擊者可以獲取到數據庫的版本信息,從而了解數據庫的漏洞和安全弱點。
3.8 基于批量的注入
基于批量的注入[5]是攻擊者通過構造惡意的SQL 語句,將多個注入語句一次性提交給服務器,以提高注入成功的概率。攻擊者在注冊框中輸入大量的惡意語句,例如 ′ OR 1=1; SELECT * FROM users; --。當這個輸入被拼接到SQL查詢中時,它會變成:
INSERT INTO users (username, password)VALUES (′′ OR 1=1; SELECT * FROM users; --′, ′輸入的密碼′), (′惡意用戶名1′, ′惡意密碼1′), (′惡意用戶名2′, ′惡意密碼2′), ...;
這個惡意的輸入利用了批量插入的特性,將惡意的SQL語句與正常的插入語句一起提交給服務器。這樣,攻擊者可以一次性插入大量的惡意數據,并且獲取到users表中的所有數據。
4 SQL 注入攻擊實踐案例
網絡安全實踐中,探索發現某網站“忘記密碼”頁面存在SQL注入漏洞,利用時間盲注成功繞過了網站綁定的指定郵箱,并獲取了敏感信息,攻擊過程如下。
Step1:測試是否存在注入漏洞。通過測試語句1′ or sleep(5)#, 發先頁面5s后才加載完成,證明數據庫執行了休眠5s的操作,存在時間盲注。
Step2:確定查詢字段個數。通過數據庫order by 語句確定字段個數,構造paylaod: admin′ order by 10# 不報錯,而admin′ order by 11# 報錯,可確定從表中讀取了10個字段值。
Step3:查詢數據庫版本信息。通過union聯合查詢的注入可以判斷回顯字段: 1′ union select 1,2,3,4,5,6,7,8,9,10#。于是把payload改為 1′ union select 1,ver?sion(),3,4,5,6,7,8,9,10#。
5 SQL 注入攻擊檢測技術
SQL注入攻擊對全球經濟造成了巨大損失,并導致大量隱私數據被泄露。為了應對這一威脅,針對SQL注入攻擊行為檢測技術研究也是層出不窮,主要有基于規則的檢測、基于機器學習的檢測、基于行為分析的檢測[6-7],三種檢測技術的優缺點如表2所示。
5.1 基于規則的檢測技術
基于規則的偵測技術是最早被提出并被廣泛應用的SQL注入攻擊偵測方法之一。該方法通過事先定義一系列規則,檢測輸入的SQL語句中是否包含可能引發注入攻擊的惡意代碼。該方法的優點是簡單易行,但缺點是規則的編寫和維護較為煩瑣,并且無法檢測未知的攻擊模式。惡意行為是否存在,可以通過這種基于預定規則的檢測技術進行檢測。在SQL 注入攻擊的情況下,定義一些常見的SQL注入關鍵字,如“DROP”“DELETE”“SELECT”“UPDATE”等。然后,通過輸入SQL查詢,在查詢包含任何關鍵詞的前提下,判斷為SQL注入攻擊。
5.2 基于機器學習的檢測技術
基于機器學習的檢測技術通過訓練機器學習模型,將正常的SQL語句和惡意的 SQL 語句進行區分,從而能夠自動學習和識別惡意行為的模式。常用的機器學習算法包括決策樹、支持向量機、神經網絡等。這種方法的優點是可以對未知的攻擊方式進行偵測,并且具有很高的偵測精確度。然而,基于機器學習的檢測方法需要大量的訓練數據和計算資源,并且容易受到攻擊者的對抗性樣本攻擊。
5.3 基于行為分析的檢測技術
基于行為分析的SQL注入攻擊檢測技術是近年來的研究熱點之一。該方法通過對數據庫系統中的SQL查詢語句進行分析,檢測異常的行為模式。常用的行為分析方法包括序列模式挖掘、聚類分析、關聯規則挖掘等。該方法的優點是可以檢測復雜的注入攻擊模式,并且對于未知的攻擊具有一定的適應性。然而,基于行為分析的方法需要對數據庫系統進行深入的分析和建模,且對系統性能有一定的影響。在實際應用中,使用序列模式挖掘算法來檢測異常的查詢序列模式,通過監控數據庫系統的查詢日志,并分析查詢的模式和頻率來檢測異常行為,循環中不斷地獲取最新的查詢日志,以提高檢測性能。
5.4 其他檢測技術
除了上述三種主要的檢測技術,還有一些其他的檢測方法被提出。例如,基于模型檢測的方法通過對SQL語句的語法和語義進行分析,檢測可能引發注入攻擊的漏洞。基于正則表達式的方法通過定義一系列正則表達式模式,檢測輸入的SQL語句中是否包含惡意的代碼。
6 結束語
SQL注入漏洞是一種常見且易于利用的漏洞,對數據庫系統和應用程序的安全構成了嚴重威脅。本文重點研究了SQL注入攻擊技術,下一步將針對SQL 注入攻擊檢測技術[8]進行深入研究,研究方向包括異常檢測和自適應防御系統、云環境下的SQL注入攻擊防御,以及物聯網和大數據環境下的SQL注入攻擊研究。