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