很久前就看到Sqli-labs這個練習(xí)Sql注入的項目壁畸,但是也只是斷斷續(xù)續(xù)做過幾個簡單的題目前酿,也就沒有再繼續(xù)下去了患雏。一直在仰望大神,自己卻原地不動罢维。還是需要腳踏實地淹仑,一步一步走。趁著這個清明假期肺孵,重新開始學(xué)習(xí)匀借,記錄一些知識點,也幫助自己重新找回方向平窘。這篇文章也是跟著Lcamry的《MYSQL注入天書》學(xué)習(xí)吓肋,感想前輩的分享。
基礎(chǔ)知識
(1)Sql注入分類:
基于服務(wù)器接收到的響應(yīng)
1. 基于錯誤的SQL注入
2. 聯(lián)合查詢的類型
3. 堆查詢注入
4. SQL盲注
- 基于布爾SQL盲注
- 基于時間的SQL盲注
- 基于報錯的SQL盲注
基于數(shù)據(jù)類型輸入的SQL查詢
基于字符串
基于數(shù)字
基于程度和順序的注入
一階注入
二階注入
基于注入點的位置
通過用戶輸入的表單
通過cookie
通過服務(wù)器變量的位置
注入的分類也是因人而異瑰艘,對于同一種類型的注入是鬼,對注入的分類可能不一樣,不過這不太重要紫新,分類也只是為了讓我們自己更好的理解漏洞的原理均蜜,因此我們只需自己對漏洞原理有足夠的認識就行了。
(2)系統(tǒng)函數(shù):
幾個常用的函數(shù):
1. version() //MYSQL的版本
2. user() //數(shù)據(jù)庫用戶名
3. database() //數(shù)據(jù)庫名
4. @@datadir //數(shù)據(jù)庫路徑
5. @@version_compile_os //操作系統(tǒng)版本
(3)字符串連接函數(shù)
1.concat(str1,str2,...) //沒有分隔符的連接字符串
2.concat_was(separator, str1, str2...) //使用separator 作為分隔符連接字符串
3.group_concat(str1, str2 ); // 連接一個組的所有字符串芒率,并以逗號分隔每一條數(shù)據(jù)
(4)字符串截取函數(shù)
1.mid(str,start,length) //對字符串str從start開始截取長度為length的字符串
2.substr(str,start,length) 或 substring(str,start,length) //同mid函數(shù)一樣
3.left(str,n) //得到字符串左邊指定長度為n的字符串
4.ord(s) //返回字符s的ASCII碼
5.ascii(s) //同ord函數(shù)兆龙,返回字符s的ASCII碼
6.regexp ' s' //正則匹配字符串
^str //匹配字符串是否以str開始
str$ //匹配字符串是否以str結(jié)束
[str1,str2,...] //字符集合,只要匹配其中一個就滿足條件
[^str1,str2,...] //字符集合紫皇,只有不包含集合的所有字符才滿足條件
str* //字符串str出現(xiàn)零次或多次
str+ //字符串str出現(xiàn)一次或多次
str{n} //字符串str出現(xiàn)n次
str{n,m} //字符串str最少出現(xiàn)n次腋寨,最多出現(xiàn)m次
(4)一般用于嘗試的語句
ps:--+可以用#替換,都是用于注釋后面的語句
or 1=1 --+
' or 1=1 --+
" or 1=1 --+
) or 1=1 --+
') or 1=1 --+
") or 1=1 --+
")) or 1=1 --+
(5)一個重要的數(shù)據(jù)庫 information_schema
information_schema 這個數(shù)據(jù)庫是mysql自動創(chuàng)建的铃剔,這個數(shù)據(jù)庫用來記錄存在系統(tǒng)中的一些數(shù)據(jù)庫,數(shù)據(jù)表键兜,以及表的組成之間的關(guān)系。當(dāng)我們發(fā)現(xiàn)sql注入漏洞時谜疤,往往也會利用這個數(shù)據(jù)庫來查詢服務(wù)器上的各個數(shù)據(jù)庫還有數(shù)據(jù)表之間的關(guān)系现诀,進一步獲取到我們想要的數(shù)據(jù)。
在圖中可以看到TABLES這張表坐桩,我們可以通過這張表來查詢到我們想要的東西封锉,例如:
select table_name from information_schema.tables where table_schema = "security";
這行代碼就是查詢數(shù)據(jù)庫名為"security"的所有數(shù)據(jù)表的名字
而我們通過這個"information_schema"數(shù)據(jù)庫查詢數(shù)據(jù)有一個一般的流程:
- 猜測數(shù)據(jù)庫
select schema_name from information_schema.schemata
- 猜測某庫中的數(shù)據(jù)表
select table_name from information_schema.tables where table_schema = "xxx"
- 猜測某表中的所有列
select column_name from information_schema.columns where table_name="xxxx"
- 獲取數(shù)據(jù)
select * from "xxxx"