SQL注入基礎知識

2021-10-09 23:05:48 字數 3991 閱讀 2798

在owasp年度top 10 安全問題中,sql注入高居榜首。sql注入攻擊指的是通過構建特殊的輸入作為引數傳入web應用程式,而這些輸入大都是sql語法裡的一些組合,通過執行sql語句進而執行攻擊者所要的操作,其主要原因是程式沒有細緻地過濾使用者輸入的資料,致使非法資料侵入系統。

1.對於web應用程式而言,使用者核心資料儲存在資料庫中,例如mysql、sql server、oracle

2.通過sql注入攻擊,可以獲取、修改、刪除資料庫資訊,並且通過提權來控制web伺服器等其他操作

3.sql注入即攻擊者通過構造特殊的sql語句,入侵目標系統,致使後台資料庫洩露資料的過程

4.因為sql注入漏洞造成的嚴重危害性,所以常年穩居owasp top 10的榜首

1)可回顯注入

2)不可回顯注入

在可以聯合查詢的題目中,一般會將資料庫查詢的資料回顯到首頁麵中,例如

<?php.. 

.$id

=$_get

['id'];

$getid

="select id from users where user_id = '$id'";

$resuit

=mysql_query

($getid)or

ide(''.

mysql_error()

.'');

$num

=mysql_numrows

($result);

...?>

我們注意看上方的sql語句中的$id變數,該變數會將get獲取到的引數直接拼接到sql語句中,加入此時傳入一下引數:

?id = -1' union select 1 --
拼接後sql語句就變成了:

select id from users where user_id = '-1' union select 1 -- '
閉合前面的單引號,注釋掉後面的單引號,中間寫上需要的payload就可以了。

聯合查詢是最簡單的一種sql注入方法,所以大多數情況下都需要繞過某些特定字元或者是特定單詞比如:空格 或者 select、and、or等字串

updatexml

updatexml的報錯原理從本質上來說就是函式的報錯

bool盲注通常是由於開發者將報錯資訊遮蔽而導致的,但是網頁中真和假有著不同的回顯,比如為真時返回access,為假時返回false;或者為真時返回正常頁面,為假時跳轉到錯誤頁面

bool盲注中通常會配套使用一些判斷真假的語句來進行判定。常用的發現bool盲注的方法是在輸入點後面新增and 1=1和and 1=2 (該payload應在懷疑是整型注入的情況下使用)

bool盲注的原理是如果題目後端拼接了sql語句,and 1=1為真時不會影響執行結果,但是and 1=2為假,頁面則可能會沒有正常的回顯

有時我們可能會遇到將1=1過濾掉的sql注入點,這時候我們可以通過修改關鍵字來繞過過濾,比如將關鍵字修改為不常見的數值如1352=1352

時間盲注出現的本質原因也是由於後端拼接了sql語句,但是正確和錯誤存在明顯的回顯。錯誤資訊被過濾,不過,可以通過頁面響應時間進行按位判斷資料。

時間盲注類似於bool盲注,只不過是在驗證階段有所不同。bool盲注是根據頁面回顯的不同來判斷的,而時間盲注是根據頁面響應時間來判斷結果的。

sleep()函式

sleep是睡眠函式,可以使查詢資料時回顯資料的響應時間加長。

sleep(5),頁面返回將延遲5秒

get中的注入點一般最容易發現,因為我們可以在位址列中獲得url和引數等,可以用sqlmap自動注入或者手工注入等驗證是否存在注入漏洞

post中的注入點一般需要我們通過抓包操作來發現,如使用burpsuite或者瀏覽器外掛程式hackbar來傳送post包。同樣也可以使用sqlmap自動注入或者手工注入等方式驗證是否存在注入漏洞

推薦使用burpsuite的repeater模組,或者sqlmap自動注入。將sqlmap的引數設定為level=3,這樣sqlmap會自動檢測user-agent中是否存在注入漏洞

同樣推薦burpsuite中的repeater模組。在sqlmap中也可以設定引數level=2,這樣sqlmap就會自動檢測cookies中是否存在注入漏洞

判斷注入點是否存在

(1)插入單引號

插入單引號是我們最常使用的檢測方法,原理在於未閉合的單引號會引起sql語句單引號未閉合的錯誤。所以輸入乙個單引號並且成功報錯,說明此處存在sql注入漏洞

(2)數字型判斷

通過and 1=1(數字型)和閉合單引號測試語句'and'1'='1(字串型)進行判斷,這裡採用payload'1'='1的目的是為了閉合原語句後方的單引號

(3)通過數字的加減進行判斷

比如,乙個鏈結可以嘗試如果結果與相同,則證明id這個輸入點可能存在sql注入漏洞

一般來說有關sql注入的地方都會重點防禦。所以,要掌握花式的繞過技術。

即過濾如select、or、from等的關鍵字。有些防禦手段還會降這些關鍵字替換為空。這時候我們可以用穿插關鍵字的方法繞過

select	--	selselectect

or -- oorr

union -- uniunionon

...

又或者大小寫來繞過

select	--	select

or -- or

union -- union

有時候,過濾函式是通過十六進製制進行過濾的。我們可以對關鍵字的個別字母進行替換

select	--	slelc\x74

or -- o\x72

union -- unio\x6e

有時候還可以通過雙重url編碼進行繞過操作

from	--	%25%36%36%25%36%66%25%37%32%25%36%64

or -- %25%36%66%25%37%32

還有一些後端開發人員並沒有對關鍵字進行過濾,反而對空格進行了過濾

1)通過注釋繞過,一般的注釋符:

#

--//

/**/

%00

這時候我們可以通過這些注釋符來繞過空格符

select/**/username/**/from/**/user
2)通過url編碼繞過,我們知道空格的編碼是%20,所以可以通過二次url編碼進行繞過

%20	--	%2520
1)通過注釋繞過,一般的注釋符:

#

--//

/**/

%00

這時候我們可以通過這些注釋符來繞過空格符

select/**/username/**/from/**/user
2)通過url編碼繞過,我們知道空格的編碼是%20,所以可以通過二次url編碼進行繞過

%20	--	%2520
有技術大牛曾研究過,mysql中存在utf8_unicode_ci和utf8_general_ci兩種編碼格式。utf8_general_ci不僅不區分大小寫,而且ä=a,ö=o,ü=u這三種等式都成立。對於utf8_general_ci等式β=s是成立的,但是對於utf8_unicode_ci,等式β=ss才是成立

mysql 注入基礎知識

1 注入的分類 仁者見仁,智者見智。下面這個是阿德瑪表哥的一段話,個人認為分類已經是夠全面了。理解不了跳過,當你完全看完整個學習過程後再回頭看這段。能完全理解下面的這些每個分類,對每個分類有屬於你的認知和了解的時候,你就算是小有成就了,當然僅僅是 sql 注入上。基於從伺服器接收到的響應 基於錯誤的...

SQL基礎知識

本篇文章是講解sql的基礎知識,但也講得不全面,我只記錄了自己不懂的或者不熟悉的東西。一 在sql中簡單的查詢 1.重複的記錄 distinct 可以通過在選擇列表前的select語句中插入關鍵字distinct來消除重複的查詢結果記錄。比如 select distinct city from ci...

SQL基礎知識

sql作用 1.面向資料庫執行查詢 2.可從資料庫取回資料 3.可在資料庫中插入新的記錄 4.可更新資料庫中的資料 5.可從資料庫刪除記錄 6.可建立新資料庫 7.可在資料庫中建立新錶 8.可在資料庫中建立儲存過程 9.可在資料庫中建立檢視 10.可以設定表 儲存過程和檢視的許可權。資料庫操作語句 ...