1.备份
% `5 T( j# ^, E; t+ b# K* Q1)要经常把重要数据备份到专用的备份服务器,备份完毕后,可将备份服务器与网络隔离。 可采用自动的备份工具进行,要求支持FTP方式备份。2)使用系统的备份功能对安装好的系统进行阶段性备份。3)使用WonRescue等工具对注册表进行阶段性备份。4)使用Ghost对全面配置完毕的系统分区进行映像备份,并存放到隐藏的分区中。
" v" w% W# R+ t! m" m) G6 ^& @6 ?
2.设置文件共享权限$ W4 T1 V/ U1 d/ T0 x, Q: F
1)限制共享权限设置共享文件时,要注意把共享文件的权限从“everyone”组改成“授权用户”,包括打印共享。2)关闭默认共享Win 2000安装好以后,系统会创建一些隐藏的共享,在cmd下可用net share命令查看它们。要禁止这些共享。操作方法是:打开“管理工具→计算机管理→共享文件夹→共享”,在相应的共享文件夹上按右键,点“停止共享”即可。不当过机器重新启动后,这些共享又会重新开启。 + g5 F) f$ K* l* d
* w+ ~: n1 b3 L9 B7 l3.防止文件名欺骗
7 ^! c/ Z& t( q. K设置以下选项可防止文件名欺骗,如防止以.txt或.exe为后缀的恶意文件被显示为.txt文件,从而使人大意打开该文件: 双击“我的电脑→工具→文件夹选项→查看”,选择“显示所有文件和文件夹”属性设置,去掉“隐藏已知文件类型扩展名”属性设置。2 w0 i$ r0 P3 ]. | ]* d' J
* y6 H2 o% T. |4.Access数据库的安全概要# t9 N- \5 k$ g1 q9 x, h) \8 O
1)新生成的数据库在保证干净的前提下,主动在尾部合并一行ASP代码,内容一般可以为重定向,以免别人通过论坛发帖等方式嵌入有害代码后被得到执行;2)对MDB文件创建一个无效的映射,以便在IE中下载时出错;3)修改出错页面,建议将出错页面设计为正常被曝库后的内容,但给一个数据库的虚假地址(最好存在相应的虚假数据库文件,比如一个改名后的病毒等);4)在防火墙中对MDB类型的扩展名进行过滤;5)删除或禁用网站的后台数据库备份功能,而用本地安装的专门自动备份程序进行自动增量备份。6)ASP 通用防止注入的程序:功能简单说明:1.自动获取页面所有参数,无需手工定义参数名.2.提供三种错误处理方式供选择. (1).提示信息. (2).转向页面. (3).提示信息,再转向页面.3.自定义转向页面.使用方法很简单,只需要在ASP页面头部插入代码<!--#Include File="Fy_SqlX.Asp"-->包含 Fy_SqlX.Asp 就可以了~~简单实用<%Dim Fy_Url,Fy_a,Fy_x,Fy_Cs(),Fy_Cl,Fy_Ts,Fy_Zx''---定义部份 头------Fy_Cl = 1 ''处理方式:1=提示信息,2=转向页面,3=先提示再转向Fy_Zx = "Error.Asp" ''出错时转向的页面On Error Resume NextFy_Url=Request.ServerVariables("QUERY_STRING")Fy_a=split(Fy_Url,"&")redim Fy_Cs(ubound(Fy_a))On Error Resume Nextfor Fy_x=0 to ubound(Fy_a)Fy_Cs(Fy_x) = left(Fy_a(Fy_x),instr(Fy_a(Fy_x),"=")-1)NextFor Fy_x=0 to ubound(Fy_Cs)If Fy_Cs(Fy_x)<>"" ThenIf Instr(LCase(Request(Fy_Cs(Fy_x))),"''")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),"and")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),"select")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),"update")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),"chr")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),"delete%20from")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),";")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),"insert")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),"mid")<>0 Or Instr(LCase(Request(Fy_Cs(Fy_x))),"master.")<>0 ThenSelect Case Fy_Cl Case "1"Response.Write "<Script Language=JavaScript>alert('' 出现错误!参数 "&Fy_Cs(Fy_x)&" 的值中包含非法字符串!\n\n 请不要在参数中出现:;,and,select,update,insert,delete,chr 等非法字符!'');window.close();</Script>" Case "2"Response.Write "<Script Language=JavaScript>location.href=''"&Fy_Zx&"''</Script>" Case "3"Response.Write "<Script Language=JavaScript>alert('' 出现错误!参数 "&Fy_Cs(Fy_x)&"的值中包含非法字符串!\n\n 请不要在参数中出现:;,and,select,update,insert,delete,chr 等非法字符!'');location.href=''"&Fy_Zx&"'';</Script>"End SelectResponse.EndEnd IfEnd IfNext%>
7 p1 U0 c- U ~0 K
% C9 E: Y: X* Q6 v2 h4 f \: e, }5.MSSQL 注入攻击的防范
9 b8 [% x+ @2 L' f; C' t在SQL Server 2000的安装目录下的\NSSQL\BINN文件夹中有一个危险的DLL组件,就是Xplog70.dll,建议将它改名或者彻底删除!2 A" F' _) @9 z0 X A7 q+ j
4 u8 h9 z2 l" v. j8 C攻击者可调用SQL里的Master里的扩展存储过程中的xp_cmdshell来执行系统指令。1)删除扩展存储过程在控制面板→计算机管理→Microsoft SQL Server→(Local……)→数据库→master→扩展存储过程→xp_cmdshell,右击然后删除!也可以使用命令删除:sp_dropextendedproc ''xp_cmdshell''接着在系统分区搜索并删除或改名、移除 xplog70.dll 文件防止恶意者恢复上述配置。2)删除注册表操作功能删除上述位置下的:xp_regaddmultistring(向注册表添加项目)xp_regdeletekey(向注册表删除一个项)xp_regdeletevalue(向注册表删除一个键值)xp_regnumvalues(列举主键下的键值)xp_regread(读取一主键下的键值)xp_regremovemultistring(从注册表中删除项目)xp_regwrite(向注册表中数据)3)防范跨库查询每个数据库分别设置一个数据库用户,该用户只能对其拥有的数据库进行查询,禁止其他数据库(包括4个系统数据库Master Model Tempdb Msdb和两个用户数据库 Pubs t Northwind)。- p! C: E" Z( D
) l: H, z+ T2 M) R& ?2 E如果网站使用了别人的现成代码,则必须使用文本批量替换工具搜索“POWERED BY……”之类的版权特征信息,并进行替换,以免源代码存在漏洞时,别人可以通过搜索引擎快速找到你的网站,从而减少被随意入侵的机率。: j! J' B$ d3 X/ \0 q( l
& M4 ?8 p0 q! S- p5 M
6. MSSQL Server 的基本安全策略
: u5 |9 v! u& T' ~, g% s5 m这些步骤是针对任何SQL Server安装的部分标准安全“最佳策略”。
" g3 B+ i, ^# z+ R4 ]首先,打上SQL SERVER最新的安全补丁,现在补丁已经出到了SP3。下载地址:sql/downloads/2000/sp3.asp" target=_blank>http://www.microsoft.com/sql/downloads/2000/sp3.asp。如果这一步都没有做好,那我们也没有继续下去的必要了。
# Q. S/ y0 j# J+ E2 t4 Q) X
- r- U; a( V! H6 t8 c6 R3 P8 m1. 确保你的SA登录帐号的密码非空。只有你的SA登录帐号没有安全保障的时候蠕虫才会工作。
* z) M/ I: O1 t5 D) s因此,你应该遵循在SQL Server+ w i9 Q( k) [
联机文档中“系统管理员(SA)登录”主题中的推荐模式,确保固有的SA帐号具有一个强壮的密码,- K) J' H8 z5 B) R# [( W
即使是你自己从不使用SA帐号。
+ `0 w$ B R& Z( W2. 在你的互联网网关或防火墙上屏蔽1433端口和/或指定SQL Server监听一个可选的端口。' |- ?8 z' Y6 d& n! A
3. 假如在你的互联网网关上需要利用1433端口,启动用于防止此端口滥用的流入/流出过滤。1 g2 @2 J: W0 B* V/ T0 F
4. 将SQLServer和SQL Server客户端运行在微软的Windows NT帐号下,而不是localsystem。/ J7 c8 w9 z: m0 `7 ^
5. 启动Windows NT验证,启动监听成功和失败的登录,然后停止并重启MSSQLServer服务。设置你的客户端使用NT验证。
, n9 a( G% T. E) N$ [4 K/ e* h6. 改默认的1433端口,并且将SQL SERVER隐藏。这样能禁止对试图枚举网络上现有的 SQL Server 客户端所发出的广播作出响应。另外,还需要在TCP/IP筛选中将1433端口屏蔽掉,尽可能的隐藏你的SQL SERVER数据库。这样子一但让攻击创建了SQL SERVER的账号,也不能马上使用查询分析器远程登陆来进行下一步的攻击。单从ASP,PHP等页面构造恶意语句的话,还有需要查看返回值的问题,总比不上直接查询分析器来得利落。所以我们首先要做到即使让别人注入了,也不能让攻击者下一步做得顺当。修改方法:企业管理器 --> 你的数据库组 --> 属性 --> 常规 --> 网络配置 --> TCP/IP --> 属性 ,在这儿将你的默认端口进行修改,和SQL SERVER的隐藏。
]% `! D0 Z6 }- G6 n7.合理创建角色% `) A1 t q! z8 W s E3 v0 R
SQL INJECTION往往在WEB CODE中产生。而做为系统管理员或者数据库管理员,总不能常常的去看每一段代码。即使常常看代码,也不能保证我们在上面的疏忽。那怎么办?我们就要从数据库角色着手,让数据库用户的权限划分到最低点。SQL SERVER的默认权限让人真的很头疼,权限大得非常的高,权限小的又什么都做不了,SYSADMIN和db_owner真是让人又爱又恨。攻击者一但确认了网站存在SQL INJECTION漏洞,肯定有一步操作步骤就是测试网站的SQL SERVER使用者具有多大的权限。一般都会借助SELECT IS_SRVROLEMEMBER(''sysadmin''),或者SELECT IS_MEMBER(''db_owner''),再或者用user = 0(让字符和数字进行比较,SQL SERVER就会提示了错误信息,从该信息中即可知道一些敏感信息)等语句进行测试。方法还有,我也不敢多说了。其一怕错,其二怕联盟中的人扁。在当前,如果网站的数据库使用者用的是SA权限,再加上确认了WEB所处在的绝对路径,那么就宣告了你的网站的OVER。db_owner权限也一样,如果确认了绝对路径,那么有50%的机会能给你的机器中上WEB 方式的木马,如海阳等。所以这儿我们确认了一点,我们必须要创建自已的权限,让攻击者找不着下嘴的地方。在这儿引用一个SQL SERVER联机帮助中的例子:
t6 T5 p3 o; g7 Z$ r# G7 w' O6 l; P! e' Q
创建 SQL Server 数据库角色的方法(企业管理器)
z& g7 o0 W5 ]& |( @1 U创建 SQL Server 数据库角色
0 U) D/ t( k/ [! O1 X4 ^* J1. 展开服务器组,然后展开服务器。
( C X7 M6 J4 f2. 展开"数据库"文件夹,然后展开要在其中创建角色的数据库。
5 @4 V# y u8 c4 U3. 右击"角色",然后单击"新建数据库角色"命令。
0 s/ g: t0 ^/ f* m6 j3 Q2 L3 y4 I4. 在"名称"框中输入新角色的名称。
1 b& y' ?( q% O$ }, V; C: ]5. 单击"添加"将成员添加到"标准角色"列表中,然后单击要添加的一个或多个用户。(可选) ! {4 k9 f2 F9 I3 X5 O6 J
只有选定数据库中的用户才能被添加到角色中。
: ]% I4 \+ Y/ ]8 ]- v8. 合理的权限配置
6 z, @: U# T7 g5 f5 \ o+ P对象权限
- Y ]. y( |! a9 O( t处理数据或执行过程时需要称为对象权限的权限类别: " X, u8 @5 q+ \+ V- \
· SELECT、INSERT、UPDATE 和 DELETE 语句权限,它们可以应用到整个表或视图中。; n7 j8 ~: u- |' V& }) ^) u9 t. I
· SELECT 和 UPDATE 语句权限,它们可以有选择性地应用到表或视图中的单个列上。1 v, ?: @0 ^* k: E$ } j
· SELECT 权限,它们可以应用到用户定义函数。# |: b5 C' Y9 C6 I; V. J6 O2 |
· INSERT 和 DELETE 语句权限,它们会影响整行,因此只可以应用到表或视图中,而不能应用到单个列上。
& S8 L9 z8 T8 M0 |· EXECUTE 语句权限,它们可以影响存储过程和函数。
4 g! U9 x( o6 C7 X w+ F+ r- i7 i; m3 x# z: R* A- E6 k
语句权限
7 i& O/ L- F) P+ {1 @创建数据库或数据库中的项(如表或存储过程)所涉及的活动要求另一类称为语句权限的权限。例如,如果用户必须能够在数据库中创建表,则应该向该用户授予 CREATE TABLE 语句权限。语句权限(如 CREATE DATABASE)适用于语句自身,而不适用于数据库中定义的特定对象。
& F- \! g! @: I# r1 t$ L6 v语句权限有: $ }: J) a C0 z% Y+ r0 d
· BACKUP DATABASE+ c, c# s/ @ x5 r+ }8 v
· BACKUP LOG! b$ ], U! _) _% r x
· CREATE DATABASE; K3 v% Q7 O) s( A) m3 G( f
· CREATE DEFAULT
( r- {$ B8 g7 P· CREATE FUNCTION
5 {5 B& j/ V( M. g8 M( T: D$ M· CREATE PROCEDURE
! C t) @" G2 U, ^; I2 b: D· CREATE RULE# t4 x8 o1 S- e. w5 N8 V/ p
· CREATE TABLE
( v6 N& o# x" |1 o- ~· CREATE VIEW
% ]7 N' U. u S- @% B: X {9 ?/ U5 t# U. E* o# D: N; @
暗示性权限
6 U( N% V. s% V' r$ T暗示性权限控制那些只能由预定义系统角色的成员或数据库对象所有者执行的活动。例如,sysadmin 固定服务器角色成员自动继承在 SQL Server 安装中进行操作或查看的全部权限。 ) k' t; \' Q& k, K' z/ }
数据库对象所有者还有暗示性权限,可以对所拥有的对象执行一切活动。例如,拥有表的用户可以查看、添加或删除数据,更改表定义,或控制允许其他用户对表进行操作的权限。3 ~3 k# W1 h) y+ @ F. n
% i. H% F. E" l' C0 b3 c
db_owner 在数据库中有全部权限。0 h' r0 W( m( L" E) r; t
db_accessadmin 可以添加或删除用户 ID。5 C- F, v8 @, y- o5 Q
db_securityadmin 可以管理全部权限、对象所有权、角色和角色成员资格。2 j# ~. y3 u1 f! p) ?+ m k8 q
db_ddladmin 可以发出 ALL DDL,但不能发出 GRANT、REVOKE 或 DENY 语句。
9 z6 p" C J* \. s: Ddb_backupoperator 可以发出 DBCC、CHECKPOINT 和 BACKUP 语句。 ~7 y! i5 w1 f( w1 @5 r
db_datareader 可以选择数据库内任何用户表中的所有数据。
: g3 v8 K2 c' I* e' [db_datawriter 可以更改数据库内任何用户表中的所有数据。
b \: a2 C+ t! `8 H% [1 Zdb_denydatareader 不能选择数据库内任何用户表中的任何数据。6 f- A% z" @9 w/ R% D2 M' x
db_denydatawriter 不能更改数据库内任何用户表中的任何数据。
9 l, x) o3 j" J0 T! v/ r
/ s3 l: o \% H8 R1 F) K% a在这儿把新建的数据库角色的权限配置好,比如需要使用哪个表、视图、存储过程等。然后把Db_owner和db_securityadmin、db_backupoperator取消,不给攻击者BACKUP DATABASE和CREATE TABLE的机会,一但攻击者具有这两个权限,那么你的网站就还处在十分危险的状态。还有注意一下,在创建数据库账号时,千万不能对服务器角色进行选择。; b& u( ~0 `+ |- ]% ]
9.修改SQL SERVER内置存储过程。SQL SERVER估计是为了安装或者其它方面,它内置了一批危险的存储过程。能读到注册表信息,能写入注册表信息,能读磁盘共享信息等等……各位看到这儿,心里可能会在想,我的网站中有其它的代码,又不像查询分析器那样能查接将结果输出。给你这个权限,又不能怎么样,还是看不到信息。如果各位这样想就大错特错了。提示一下,如果攻击者有CREATE TABLE的权限,那么创建一个临时表,然后将信息INSERT到表中,然SELECT出来,接着跟数字进行比较,让SQL SERVER报错,那么结果就全出来了……所以我们要报着宁错杀,不放过的态度进行修补。# _5 N1 W, L# V8 B# A$ G* {0 B g
. U7 l2 E4 e# B+ A/ c! O) h先来列出危险的内置存储过程:
. J1 k+ q7 _# `3 H6 `$ }+ p( w2 V$ Q ~9 M" ]& |
xp_cmdshell& f" M1 w7 `# ]' d/ Z
xp_regaddmultistring
: T! ~$ G' p ]; |1 F ^: kxp_regdeletekey
$ T6 G0 a0 j: p5 }% o- W9 ^+ `, E/ [' Qxp_regdeletevalue( r6 D: {% m |" Q8 D1 m& a3 H
xp_regenumkeys
0 B" J2 q. T' M1 q2 txp_regenumvalues' ~& i+ y# c7 c
xp_regread
! k1 Z7 S* c m; ?% ]xp_regremovemultistring( g. g+ z$ N% f# h; P
xp_regwrite- F H( T8 t( ^) ~/ M6 x! S
. }; w( ^; U4 `, x& `2 a# kActiveX自动脚本:
( |3 a* [* `/ P- A5 T( C' W% O. `! t1 v; g6 N
sp_OACreate
; W( G1 ^7 y4 K% s- H- qsp_OADestroy2 _- S1 B) u3 j/ w) m
sp_OAMethod1 i0 N" E' F e
sp_OAGetProperty1 `5 g {/ [- n6 t/ g
sp_OASetProperty
! S3 L0 h8 G6 B' M3 f0 Asp_OAGetErrorInfo
$ u6 R7 G8 U* Csp_OAStop
1 T8 @% L7 w1 i4 Z
6 _3 R* g- f* ]+ [" \ U6 \以上各项全在我们封杀之列,例如xp_cmdshell屏蔽的方法为:sp_dropextendedproc ''xp_cmdshell'',如果需要的话,再用sp_addextendedproc ''xp_cmdshell'', ''xpsql70.dll''进行恢复。如果你不知道xp_cmdshell使用的是哪个.dll文件的话,可以使用sp_helpextendedproc xp_cmdshell来查看xp_cmdshell使用的是哪个动态联接库。另外,将xp_cmdshell屏蔽后,我们还需要做的步骤是将xpsql70.dll文件进行改名,以防止获得SA的攻击者将它进行恢复。 , i `0 _ ~. l3 a! q, m
|