注入攻擊類型與方式
1、union注入
①:查詢
union操作符一般與order by語句配合使用
注意:union前面不能有order by,如果后面也有order by,前面的也是白寫了,
所以要想使用order by+union就得把有order by的語句封裝成一個對象,再用select * from(......)as a union......。
只在有union的語句的最后寫個order by是ok的,就是兩個查詢結果放一起之后再排序的意思
union 和union all的區別,前者去重且排序、后者不去重不排序
mysql> select id,email from member where username='kevin' union select username,pw from member where id=1;
②:注入
v' union select username,pw from member where id=1#%
上圖沒有出現錯誤,但不代表類似的都不會出現錯誤,如果出錯,他的原因可能是
因為查詢的字段不能超過主查詢的字段,這個時候可以在SQL語句后面加order by進行排序,通過這個辦法可以判斷主查詢的字段
通過以下方法猜它有幾個字段
當查出有兩個字段以后,再進行聯合查詢
a' union select 1,2#%(如果有10個字段,就從1寫到10)
這里1,2這些說的是這個字段是可寫可帶入(帶入數據庫函數)的字段
a' union select database(),user()#%
,(再將這個帶進去查詢,結果如下圖所示)
2、information_schema注入
①:獲取pikachu數據庫的表名,u' union select table_schema ,table_name,3 from information_schema.tables where table_schema='pikachu'#
如上圖所示:獲取到這個數據庫中的表名,可以看出user表對我們最有用,那么接下來就要獲取表中的字段了
k' union select table_name,column_name ,2 from information_schema.columns where table_name='users'#%
③:獲取字段值(如果經驗豐富的話就不需要前面的步驟,直接進行爆破)
3、基於函數報錯注入
①:技巧思路:
在MYSQL中使用一些指定的函數來制造報錯,從而從報錯信息中獲取設定的信息,常見的select/insert/update/delete注入都可以使用報錯方式來獲取信息.
②:背景條件:
后台沒有屏蔽數據庫報錯信息,在語法發生錯誤時會輸出在前端.
4、insert注入
insert注入,就是前端注冊的信息最終會被后台通過insert這個操作插入數據庫,后台在接受前端的注冊數據時沒有做防SQL注入的處理,導致前端的輸入可以直接拼接SQL到后端的insert相關內容中,導致了insert注入。
注冊賬號,賬號新增到數據庫中
5、update注入
與insert注入的方法大體相同,區別在於update用於用戶登陸端,insert用於用於用戶注冊端。
一般登錄網站前台或后台更新用戶信息的地方,填寫用戶需要修改相關信息,通過Burp抓包在用戶名輸入相關payload,格式如下:
update注入
' or updatexml(0,concat(0x7e,(database())),0) or'

6、delete注入
一般應用於前后端發貼、留言、用戶等相關刪除操作,點擊刪除按鈕時可通過Brup Suite抓包,對數據包相關delete參數進行注入,注入方法如下:
delete from message where id=56 or updatexml(2,concat(0x7e,(database())),0)
7、Http Header注入
原理:user-agent頭帶入到了數據庫中,與數據庫產生交互
把Http Header直接帶入數據庫,程序員在寫程序的時候,頭里面的數據和數據庫有交互,沒有交互則沒有注入點
登錄的時候沒有注入,放包到get請求這里的時候,可以看見注入點
8、Cookie注入
cookie是網站用來識別用戶身份進行跟蹤會話的,雖然Cookie是由后端生成的,但每次頁面跳轉,后端都會對前端的Cookie的信息進行驗證,但如果后端獲取Cookie后放在數據庫中進行拼接,那么這也將是一個SQL注入點,
9、Boolian(布爾型)盲注
盲注,即在SQL注入過程中,SQL語句執行選擇后,選擇的數據不能回顯到前端,我們需要使用一些特殊的方法進行判斷或嘗試,這個過程稱為盲注。
問:盲注有幾類,分別是怎么測的??????
SQL盲注分類:
1、基於布爾型SQL盲注
2、基於時間型SQL盲注
3、基於報錯型SQL盲注
怎么測
遇到布爾型SQL盲注,可以通過ascii值,
通過對比ascii碼的長度,判斷出數據庫表名的第一個字符。
注:用到substr()函數
用法:substr(string,start,length)
string(必需)規定要返回其中一部分的字符串。start(必需)規定在字符串的何處開始。length(可選)規定被返回字符串的長度。
判斷庫名的第一個字符
判斷長度
10、base on time(時間型)盲注
基於時間的延遲,構造一個拼接語句: vince' and if(substr(database(),1,1)='X' (猜測點)',sleep(10),null#,輸入后,如果猜測准確,那么就會響應10秒,如果錯誤會立刻返回錯誤。輸入:vince' and if(substr(database(),1,1)='p',sleep(10),null)#,再web控制台下,判斷出database的表名的一個字符為p。通過這個辦法我們就能逐步向下獲取數據。
報錯型盲注用updatexml再結合if來判斷就ok
11、寬字節注入
前提條件:magic_quotes_gqc參數設為ON時
注意:寬字節空格、#如果被URL編碼了,可能造成不能成功。並且只有編碼為GBK的時候才可以,GBK可以繞過被轉義的反斜杠