sqlserver學習
- 2022 年 10 月 7 日
- 筆記
一、什麼是關係型和非關係型數據庫,兩者都包含那種數據庫
1、關係型數據庫
關係型數據庫是指採用了關係模型來組織數據的數據庫。簡單來說,關係模式就是二維表格模型。
常見關係型數據庫管理系統(ORDBMS):
Oracle、MySql、Microsoft SQL Server、 SQLite、PostgreSQL、IBM DB2
2、非關係型數據庫
非關係型數據庫又被稱為 NoSQL(Not Only SQL ),意為不僅僅是 SQL。通常指數據以對象的形式存儲在數據庫中,而對象之間的關係通過每個對象自身的屬性來決定,常用於存儲非結構化的數據。
常見非關係型數據庫管理系統:
鍵值數據庫:Redis、Memcached、Riak 列族數據庫:Bigtable、HBase、Cassandra
文檔數據庫:MongoDB、CouchDB、MarkLogid 圖形數據庫:Neo4j、InfoGrid
二、MSsql數據庫的學習
1、linux安裝mssql參考
MSSQL(MicroSoft SQL Server數據庫),是微軟開發的關係型數據庫管理系統DBMS,是一個較大型的數據庫,提供數據庫的從服務器到終端的完整的解決方案,數據庫管理系統SSMS(SQL Server Managerment Studio),是一個用於建立、使用和維護數據庫的集成開發環境。 端口號:1433
命令行登錄
系統默認數據庫
mssql新安裝後默認有四個數據庫
(1)master:master 數據庫記錄 SQL Server 系統的所有系統級信息。 這包括實例範圍的元數據(例如登錄帳戶)、端點、鏈接服務器和系統配置設置。 在 SQL Server中,系統對象不再存儲在 master 數據庫中,而是存儲在 Resource 數據庫中。 此外, master 數據庫還記錄了所有其他數據庫的存在、數據庫文件的位置以及 SQL Server的初始化信息。 因此,如果 SQL Server master 數據庫不可用,則 無法啟動。
(2)model 數據庫用於在 SQL Server 實例上創建所有數據庫的模板。 因為每次啟動 時都會創建 tempdb SQL Server ,所以 model 數據庫必須始終存在於 SQL Server 系統中。 model 數據庫的全部內容(包括數據庫選項)都會被複制到新的數據庫。 啟動期間,也可使用 model 數據庫的某些設置創建新的 tempdb ,因此 model 數據庫必須始終存在於 SQL Server 系統中。
model 的用法:當發出 CREATE DATABASE 語句時,將通過複製 model 數據庫中的內容來創建數據庫的第一部分, 然後用空頁填充新數據庫的剩餘部分。如果修改 model 數據庫,之後創建的所有數據庫都將繼承這些修改。
(3)msdb 數據庫由SQL Server 代理用於計劃警報和作業,以及其他功能。
(4)tempdb顯式創建的臨時用戶對象。 它們包括全局或局部臨時表及索引、臨時存儲過程、表變量、表值函數返回的表或游標。
tempdb 中的操作是最小日誌記錄操作,以便回滾事務。 每次啟動 SQL Server 時都會重新創建 tempdb,從而在系統啟動時總是具有一個乾淨的數據庫副本。 在斷開聯接時會自動刪除臨時表和存儲過程,並且在系統關閉後沒有活動連接。tempdb 不會有什麼內容從 SQL Server 的一個會話保存到另一個會話。 不允許對 tempdb 執行備份和還原操作。
Sql Server中創建數據庫中默認表的作用
2.MSsql數據類型
包括系統數據類型和用戶自定義數據類型
其中系統數據類型有;
(1)數字型
整型
浮點型
float [ (n) ] 其中 n 為用於存儲 float 數值尾數的位數(以科學記數法表示),因此可以確定精度和存儲大小 。 如果指定了 n,則它必須是介於 1 和 53 之間的某個值 。 n 的默認值為 53 。
(2)字符型
char [ ( n ) ] 固定大小字符串數據 。 n 用於定義字符串大小(以位元組為單位),並且它必須為 1 到 8,000 之間的值 。
varchar [ ( n | max ) ] 可變大小字符串數據 。 使用 n 定義字符串大小(以位元組為單位),可以是介於 1 和 8,000 之間的值;或使用 max 指明列約束大小上限為最大存儲 2^31-1 個位元組 (2GB)。
nchar [ ( n ) ]
固定大小字符串數據。 n 用於定義字符串大小(以雙位元組為單位),並且它必須為 1 到 4,000 之間的值。 存儲大小為 n 位元組的兩倍。
二進制
binary [ ( n ) ] 長度為 n 位元組的固定長度二進制數據,其中 n 是從 1 到 8,000 的值。 存儲大小為 n 位元組。
varbinary [ ( n | max) ] 可變長度二進制數據。 n 的取值範圍為 1 至 8,000。 max 指示最大存儲大小是 2^31-1 個位元組。
(3)日期
date
datetime用於定義一個與採用 24 小時制並帶有秒小數部分的一日內時間相組合的日期。
time定義一天中的某個時間。 此時間不能感知時區且基於 24 小時制
3.創建數據庫和表
創建三張表
student表
創建表語句
create table 數據庫.模式.表名(
字段名 類型 約束
)
course表
sc表
查詢當前數據庫的表名
添加一個字段
alter student add sage smallint;
4插入數據
INSERT INTO student (Sno,Sname,Ssex,Sdept,Sage) VALUES (‘201215125′,’張立’,’男’,’IS’,19);
出現了中文亂碼,解決辦法:將字段的數據類型變成NCHAR,然後插入數據的時候前面加N
INSERT INTO student (Sno,Sname,Ssex,Sdept,Sage) VALUES (‘201215125’,N‘張立’,N‘男’,N‘IS’,19);
5查詢數據(select)
(1)select * from Student;
(2)select Sname,Sno from Student where Sage=19;
(3)select Sname,Sno from Student union select Cno,Cname from Course;
union 查詢滿足的條件:
前後字段類型兼容(NULL和所有的數據類型兼容)
字段數相同
select Sname,Sno from Student union select NULL,NULL from Course;
(4)select * from Student order by 1;
(5)select @@version;查詢數據庫版本
select db_name();查詢當前數據庫
select @@servername; #查詢服務名
select host_name(); #查詢主機名,如果是用navicat遠程連接的話,主機名是本地的名字
select user; #查詢當前數據庫的擁有者,結果為 dbo。dbo是每個數據庫的默認用戶,具有所有者權限,
全稱:datebaseOwner ,即DbOwner
select substring(‘string’,2,1) #截取給定字符串的索引為2的1個字符
select ascii(‘a’);#獲得固定字符的ascii碼值
select len(‘string’);#獲取字符串的長度
select name from sysobjects where type=’U’ #查詢當前數據庫中所有表的名字
select name from testdb..sysobjects where xtype=’U’ #查詢指定testdb數據庫中表的名字
select name from testdb..syscolumns where id=(select max(id) from test..sysobjects where xtype=’u’ and name=’SC’) #查詢當前數據庫的指定users表的所有列的名字
(6)like匹配
6.更新操作(update)
基礎語法:UPDATE 表名稱 SET 列名稱 = 新值 WHERE 列名稱 = 某值
update Student set Sno = ‘201215124’ WHERE Sdept=’MA’;
7.增加操作(insert)
INSERT INTO 表名稱 VALUES (值1, 值2,….);
在不指定表字段的情況下values的值必須與默認字段相匹配
insert into Student values(N’201215127′,N’張三’,N’男’,24);
ALTER TABLE 語句用於在已有的表中添加、修改或刪除列。
增加字段ALTER TABLE table_name ADD column_name datatype
alter table Student add Ss int default 0;
8.刪除操作(drop)
語法
drop table 表名
三、mssql的權限
sa:在搭建時,選擇使用SQL Server身份驗證會創建SA賬戶並設置密碼,SA(System Administrator)表示系統管理員,在SQLServer2019之前的SA用戶都是系統最高權限用戶SYSTEM,但在2019版本時為普通數據庫用戶mssqlserver,是一個低權用戶。
mssql的三種權限級別:
sa權限:數據庫操作,文件管理,命令執行,註冊表讀取等價於system,SQLServer數據庫的最高權限
db權限:文件管理,數據庫操作等價於 users-administrators
public權限:數據庫操作等價於 guest-users
select is_srvrolemember(‘sysadmin’) ;#判斷是不是管理員權限
select is_member(‘db_owner’);#判斷是不是db_owner權限
select is_srvrolemember(‘public’);# 判斷是否是public權限
四、文件讀寫操作和命令執行
1.開啟xp_cmdshell插件
xp_cmdshell是Sql Server中的一個組件,默認關閉,將命令字符串作為操作系統命令 shell 執行,並以文本行的形式返回所有輸出。通常在拿到sa口令之後,可以通過xp_cmdshell來進行提權,
查看是否開啟xp_cmdshell
select count(*) from master.dbo.sysobjects where xtype=’x’ and name=’xp_cmdshell’
返回1說明開啟
-- To allow advanced options to be changed. EXECUTE sp_configure 'show advanced options', 1; GO -- To update the currently configured value for advanced options. RECONFIGURE; GO -- To enable the feature. EXECUTE sp_configure 'xp_cmdshell', 1; GO -- To update the currently configured value for this feature. RECONFIGURE; GO
利用xp_cmdshell執行命令
exec xp_cmdshell ‘whoami’;或execute(‘xp_cmdshell “whoami”‘) ;
EXEC sp_configure 'show advanced options', 1 RECONFIGURE EXEC sp_configure 'xp_cmdshell',0 RECONFIGURE
2、利用xp_cmdshell
Metasploit
可以使用mssql_exec模塊,它主要啟用 xp_cmd shell,我們還可以設置任何 cmd 可執行命令。這裡我們設置cmd命令為「 ipconfig 」
netcat
在這裡,我們可以使用 netcat 在目標機器上獲得反向連接。為此,我們首先需要將 netcat 二進制文件傳輸到 Windows 機器。為此,我們將使用 nc.exe 可執行文件。該文件位於 /usr/share/windows-binaries。 然後我們可以使用 Python one-liner 創建一個 HTTP 服務。
在這裡,powershell.exe cmdlet 調用 PowerShell,然後使用 wget 命令將 netcat 下載到 具有寫入權限的C:/Users/Public目錄中。然後我們將使用 XP 命令 shell 執行 netcat 二進制文件來運行 cmd.exe。在端口 4444 上創建與主機 Kali 機器的反向連接。
在kali開啟監聽
3、寫文件
(1)判斷文件是否存在sys.xp_fileexist
0表示不存在,1表示存在
sys.xp_create_subdir 用於創建子目錄,參數是子目錄的路徑:
exec master.sys.xp_create_subdir ‘c:\User\root\hack’
(2)創建好目錄後,就可以寫文件;但是需開啟xp_cmdshell組件
(3)一般思路為拿到權限後先創建一個表,然後把文件寫入表,最後從表讀取文件
五、用戶哈希
哈希是一種特定類型的算法,可生成固定長度的輸出字符串。哈希碼的長度總是相同的,但它的複雜性會根據它的使用方式而有所不同,並且可能會為不同的輸入字符串產生不同的哈希值。SQL Server 使用散列技術而不是加密,因為它提供了一種單方面的過程來散列數據。而且由於散列,它被逆轉的機會幾乎為零。從 SQL Server 2016 開始,使用的唯一哈希算法是 SHA2_512 和 SHA2_256。它為所需的輸入創建 32 位或 64 位的散列。您可以通過 HashByte 函數在 SQL 服務器中創建哈希。
哈希格式:
查詢所有用戶的哈希
查詢特定用戶hash
用nmap遠程哈希
nmap -p1433 –script ms-sql-dump-hashes –script-args mssql.username=sa,mssql.password=123.com@ 192.168.43.134
現在我們已經獲得了哈希值,我們所要做的就是破解它們。為此,我們將使用萬能的密碼破解工具,即John。要對密碼哈希進行反哈希,請使用以下命令: