SQL注入學習總結

最近系統性的重新學習了一下SQL注入,做個總結讓印象更加深刻。

一,什麼是SQL注入

個人總結為:通過WEB系統中提供的數據輸入入口,利用構造特殊字元串將原SQL語句拼接成實現其他功能的SQL語句,從而實現對原不可見的數據進行操作的目的。

二,SQL注入能做什麼

1,在資料庫中查詢WEB系統本不允許查詢的內容

2,在許可權允許之外,對資料庫內容進行增,刪,改,查等

3,通過調用系統函數實現對目標主機的控制和操縱

4,向目標主機寫入文件或讀取目標主機的特定文件內容

三,SQL注入實現方法

基本思路包括:「管中窺豹」,「斷章取義」,「移花接木」,「拋磚引玉」,「無中生有」。

管中窺豹

「窺一斑而知全豹」,通過WEB頁面功能,結合輸入特殊字元從而猜測出後台SQL語句的內容。

上圖中,通過在id=1後面加一個引號,引起報錯,從而猜測出SQL語句大概為SELECT * FROM table WHERE id='' LIMIT 0,1。

斷章取義

將原本的SQL語句通過單引號,雙引號,括弧,注釋符和製表符等特殊符號進行分割,從而改變原來的意義。

上圖中的SQL語句,id為輸入參數,可以在輸入字元串中填入「 1』 –+ 」,通過輸入的引號將原來的引號閉合,加上–+將後面內容注釋掉,成功修改了原語句。

移花接木

通過在SQL語句中接上其他內容,從而實現特定目的。如在上面例子,將輸入內容改為「 ?id=-1' union select 1,database(),user() –+ 」,在頁面回顯的內容里可以知當前資料庫名和用戶名。

拋磚引玉

在頁面無法將所查詢內容返回,只返回資料庫查詢語句錯誤時,可以通過故意構造錯誤語法,將想得到的內容通過報錯資訊返回。下圖的例子中,不論id的值是多少,返回的內容都一樣,可見顯示內容不是來自於查詢結果,所以不能直接將構造好的語句查詢結果返回。

但當SQL語句出現錯誤時會有報錯。

通過使用Extractvalue()函數,故意引起報錯來返回想要的結果。將輸入內容改為「 ?id=1' union select 1,2,(extractvalue('s',concat('~',database()))) –+ 」得到了當前資料庫名。

無中生有

對於既不返回數據,又不返回錯誤的WEB,可以通過其反回的成功以及失敗的結果判斷查詢內容是否存在。這種方法業內叫做「盲注」

盲注大體上分為布朗型盲注和時間盲注。

布朗型盲注的特點是WEB頁面有返回值,但只返回成功或失敗。比如網站登錄頁面,只會返回登錄成功或登錄失敗。

如下圖中的例子,當id值存時,頁面顯示一個固定的字元串。當id值不存在或語法錯誤時,什麼內容都不顯示,這種情況就適合盲注。

時間盲注的特點是頁面無返回,但可以在語句中拼接出sleep()函數,假設語句查詢有結果則執行sleep,而查詢無結果則不執行sleep,根據頁面相應時間的不同可以將沒有返回值的頁面變成布朗型。

盲注只能返回語句執行結果,那麼怎麼獲得資料庫中的內容呢?

盲注需要依賴合理的猜測和窮舉,例如,我們可以肯定資料庫中的內容是字元串,那麼由於ASCII碼是有範圍的,所以可以通過窮舉法爆破出內容。但如果對資料庫的內容毫無頭緒,就沒有辦法確定爆破所用字典的內容,也就無法成功獲得想要的資訊了。

盲注的最大意義在於#漏洞存在的更加隱蔽#很容易存在於現有的系統中,如果同時環境中存在著其他不當的配置(如資料庫用戶許可權過大,目錄存在寫許可權等),利用盲注的漏洞將很容易拿到伺服器的shell。

總結

學習SQL注入不要被網上的各種分類搞暈,不能只關注方法,學習大神們思路才是真諦,漏洞找不找得到,全看腦洞夠不夠大。