mysql 注入基礎知識

2022-08-02 19:00:16 字數 3605 閱讀 1417

(1)注入的分類---仁者見仁,智者見智

下面這個是阿德瑪表哥的一段話,個人認為分類已經是夠全面了。理解不了跳過,當你完全看完整個學習過程後再回頭看這段。能完全理解下面的這些每個分類,對每個分類有屬於你的認知和了解的時候,你就算是小有成就了,當然僅僅是 sql 注入上。

基於從伺服器接收到的響應

▲基於錯誤的 sql 注入

▲聯合查詢的型別

▲堆查詢注射

▲sql 盲注

•基於布林 sql 盲注

•基於時間的 sql 盲注

•基於報錯的 sql 盲注

基於如何處理輸入的 sql 查詢(資料型別)

•基於字串

•數字或整數為基礎的

基於程度和順序的注入(**發生了影響)

★一階注射

★二階注射

一階注射是指輸入的注射語句對 web 直接產生了影響,出現了結果;二階注入類似儲存型 xss,是指輸入提交的語句,無法直接對 web 應用程式產生影響,通過其它的輔助間接的對 web 產生危害,這樣的就被稱為是二階注入.

基於注入點的位置上的

▲通過使用者輸入的表單域的注射。

▲通過 cookie 注射。

▲通過伺服器變數注射。(基於頭部資訊的注射)

(2)系統函式介紹

幾個常用函式:

1. version()——mysql 版本

2. user()——資料庫使用者名稱

3. database()——資料庫名

4. @@datadir——資料庫路徑

5.@@version_compile_os——作業系統版本

(3)字串連線函式

函式具體介紹  

1. concat(str1,str2,...)——沒有分隔符地連線字串

2. concat_ws(separator,str1,str2,...)——含有分隔符地連線字串

group_concat(str1,str2,...)——連線乙個組的所有字串,並以逗號分隔每一條資料說著比較抽象,其實也並不需要詳細了解,知道這三個函式能一次性查出所有資訊就行了。

(4)一般用於嘗試的語句

ps:--+可以用#替換,url 提交過程中 url 編碼後的#為

%23

or 1=1--+

'or 1=1--+ 

"or 1=1--+ 

)or 1=1--+ 

'  )or 1=1--+

") or 1=1--+

"))or 1=1--+

一般的**為:

$id=$_get['id'];

$sql="select * from users where

此處考慮兩個點,乙個是閉合前面你的 『 另乙個是處理後面的 『 ,一般採用兩種思路,閉合後面的引號或者注釋掉,注釋掉採用--+

(5)union 操作符的介紹

union 操作符用於合併兩個或多個 select 語句的結果集。請注意,union 內部的 select 語句必須擁有相同數量的列。列也必須擁有相似的資料型別。同時,每條 select 語句中的列的順序必須相同。

sql union 語法

select column_name(s) from table_name1

union

select column_name(s) from table_name2

注釋:預設地,union 操作符選取不同的值。如果允許重複的值,請使用 union all。

sql union all 語法

select column_name(s) from table_name1

union all

select column_name(s) from table_name2

另外,union 結果集中的列名總是等於 union 中第乙個 select 語句中的列名。

(6)sql 中的邏輯運算

這裡我想說下邏輯運算的問題。

提出乙個問題 select * from users where id=1 and 1=1; 這條語句為什麼能夠選擇出 id=1的內容,and 1=1 到底起作用了沒有?這裡就要清楚 sql 語句執行順序了。同時這個問題我們在使用萬能密碼的時候會用到。

select * from admin where username=』admin』 and password=』admin』

我們可以用 』or 1=1# 作為密碼輸入。原因是為什麼?

這裡涉及到乙個邏輯運算,當使用上述所謂的萬能密碼後,構成的 sql 語句為:

select * from admin where username=』admin』 and password=』』or 1=1#』

explain:上面的這個語句執行後,我們在不知道密碼的情況下就登入到了 admin 使用者了。原因是在 where 子句後,我們可以看到三個條件語句 username=』admin』 and password=』』or 1=1。三個條件用 and 和 or 進行連線。

在 sql 中,我們 and 的運算優先順序大於 or 的元算優先順序。因此可以看到 第乙個條件(用 a 表示)是真的,第二個條件(用 b 表示)是假的,a and b = false,第乙個條件和第二個條件執行 and 後是假,再與第三個條件 or 運算,因為第三個條件 1=1 是恆成立的,所以結果自然就為真了。因此上述的語句就是恆真了。

上述三者有什麼區別?①和②是一樣的,表達的意思是 id=1 條件和 1=1 條件進行與運算。

③的意思是 id=1 條件與 1 進行&位操作,id=1 被當作 true,與 1 進行 & 運算 結果還是 1,再進行=操作,1=1,還是 1(ps:&的優先順序大於=)ps:此處進行的位運算。我們可以將數轉換為二進位制再進行與、或、非、異或等運算。必要的時候可以利用該方法進行注入結果。例如將某一字元轉換為 ascii 碼後,可以分別與1,2,4,8,16,32.。。。進行與運算,可以得到每一位的值,拼接起來就是 ascii 碼值。再從 ascii 值反推回字元。(運用較少)

(7)注入流程

我們的資料庫儲存的資料按照上圖的形式,乙個資料庫當中有很多的資料表,資料表當中有很多的列,每一列當中儲存著資料。我們注入的過程就是先拿到資料庫名,在獲取到當前資料庫名下的資料表,再獲取當前資料表下的列,最後獲取資料。

SQL注入基礎知識

在owasp年度top 10 安全問題中,sql注入高居榜首。sql注入攻擊指的是通過構建特殊的輸入作為引數傳入web應用程式,而這些輸入大都是sql語法裡的一些組合,通過執行sql語句進而執行攻擊者所要的操作,其主要原因是程式沒有細緻地過濾使用者輸入的資料,致使非法資料侵入系統。1.對於web應用...

Spring DI依賴注入基礎知識

spring di依賴注入基礎知識 public class helloworld1 spring.xml 總結 設值注入是由set方法來進行的 並不是以他的屬性 如果有屬性而沒有set方法的話程式會報出 查詢不到name這個屬性值 設值注入依賴的就是set方法 name的值為 chi123 pub...

mysql基礎知識

一 啟動與退出 1 進入mysql 啟動mysql command line client mysql的dos介面 直接輸入安裝時的密碼即可。此時的提示符是 mysql 或開啟終端,輸入sql語句 mysql uroot p123 2 退出mysql quit或exit 二 庫操作 1 建立資料庫 ...