• 646阅读
  • 5回复

[发点垃圾]SQL安全。。。我也学一下 [复制链接]

上一主题 下一主题
离线LOVE风风
 
发帖
268
祝福宝石
0
威望
0
玛雅之石
0
创造宝石
0
只看楼主 倒序阅读 使用道具 楼主  发表于: 2006-08-22
以下东西都是我以前做服务器的时候整理的,具体怎么用,自己研究,我在VZ学了很多东西,但很少发东西,今天也发个吧,要是想骂就骂吧,反正VZ现在的风气基本上都是这样的了。

好了,废话少说,开始

SQL安全设置攻略
日前SQL INJECTION的攻击测试愈演愈烈,很多大型的网站和论坛都相继被注入。这些网站一般使用的多为SQL SERVER数据库,正因为如此,很多人开始怀疑SQL SERVER的安全性。其实SQL SERVER 2000已经通过了美国政府的C2级安全认证-这是该行业所能拥有的最高认证级别,所以使用SQL SERVER还是相当的安全的。当然和ORCAL、DB2等还是有差距,但是SQL SERVER的易用性和广泛性还是能成为我们继续使用下去的理由。那怎么样才能使SQL SERVER的设置让人使用的放心呢?

第一步肯定是打上SQL SERVER最新的安全补丁,现在补丁已经出到了SP3。下载地址:http://www.microsoft.com/sql/downloads/2000/sp3.asp。如果这一步都没有做好,那我们也没有继续下去的必要了。

第二步是修改默认的1433端口,并且将SQL SERVER隐藏。这样能禁止对试图枚举网络上现有的 SQL Server 客户端所发出的广播作出响应。另外,还需要在TCP/IP筛选中将1433端口屏蔽掉,尽可能的隐藏你的SQL SERVER数据库。这样子一但让攻击创建了SQL SERVER的账号,也不能马上使用查询分析器远程登陆来进行下一步的攻击。单从ASP,PHP等页面构造恶意语句的话,还有需要查看返回值的问题,总比不上直接查询分析器来得利落。所以我们首先要做到即使让别人注入了,也不能让攻击者下一步做得顺当。修改方法:企业管理器 --> 你的数据库组 --> 属性 --> 常规 --> 网络配置 --> TCP/IP --> 属性 ,在这儿将你的默认端口进行修改,和SQL SERVER的隐藏。

第三步是很重要的一步,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联机帮助中的例子:

创建 SQL Server 数据库角色的方法(企业管理器)
创建 SQL Server 数据库角色
1.     展开服务器组,然后展开服务器。
2.     展开"数据库"文件夹,然后展开要在其中创建角色的数据库。
3.     右击"角色",然后单击"新建数据库角色"命令。
4.     在"名称"框中输入新角色的名称。
5.     单击"添加"将成员添加到"标准角色"列表中,然后单击要添加的一个或多个用户。(可选)
只有选定数据库中的用户才能被添加到角色中。

对象权限
处理数据或执行过程时需要称为对象权限的权限类别:
·     SELECT、INSERT、UPDATE 和 DELETE 语句权限,它们可以应用到整个表或视图中。
·     SELECT 和 UPDATE 语句权限,它们可以有选择性地应用到表或视图中的单个列上。
·     SELECT 权限,它们可以应用到用户定义函数。
·     INSERT 和 DELETE 语句权限,它们会影响整行,因此只可以应用到表或视图中,而不能应用到单个列上。
·     EXECUTE 语句权限,它们可以影响存储过程和函数。

语句权限
创建数据库或数据库中的项(如表或存储过程)所涉及的活动要求另一类称为语句权限的权限。例如,如果用户必须能够在数据库中创建表,则应该向该用户授予 CREATE TABLE 语句权限。语句权限(如 CREATE DATABASE)适用于语句自身,而不适用于数据库中定义的特定对象。
语句权限有:
·     BACKUP DATABASE
·     BACKUP LOG
·     CREATE DATABASE
·     CREATE DEFAULT
·     CREATE FUNCTION
·     CREATE PROCEDURE
·     CREATE RULE
·     CREATE TABLE
·     CREATE VIEW

暗示性权限
暗示性权限控制那些只能由预定义系统角色的成员或数据库对象所有者执行的活动。例如,sysadmin 固定服务器角色成员自动继承在 SQL Server 安装中进行操作或查看的全部权限。
数据库对象所有者还有暗示性权限,可以对所拥有的对象执行一切活动。例如,拥有表的用户可以查看、添加或删除数据,更改表定义,或控制允许其他用户对表进行操作的权限。

db_owner                 在数据库中有全部权限。
db_accessadmin                 可以添加或删除用户 ID。
db_securityadmin           可以管理全部权限、对象所有权、角色和角色成员资格。
db_ddladmin                 可以发出 ALL DDL,但不能发出 GRANT、REVOKE 或 DENY 语句。
db_backupoperator           可以发出 DBCC、CHECKPOINT 和 BACKUP 语句。
db_datareader                 可以选择数据库内任何用户表中的所有数据。
db_datawriter                 可以更改数据库内任何用户表中的所有数据。
db_denydatareader           不能选择数据库内任何用户表中的任何数据。
db_denydatawriter           不能更改数据库内任何用户表中的任何数据。

在这儿把新建的数据库角色的权限配置好,比如需要使用哪个表、视图、存储过程等。然后把Db_owner和db_securityadmin、db_backupoperator取消,不给攻击者BACKUP DATABASE和CREATE TABLE的机会,一但攻击者具有这两个权限,那么你的网站就还处在十分危险的状态。还有注意一下,在创建数据库账号时,千万不能对服务器角色进行选择。


第四步是修改SQL SERVER内置存储过程。SQL SERVER估计是为了安装或者其它方面,它内置了一批危险的存储过程。能读到注册表信息,能写入注册表信息,能读磁盘共享信息等等……各位看到这儿,心里可能会在想,我的网站中有其它的代码,又不像查询分析器那样能查接将结果输出。给你这个权限,又不能怎么样,还是看不到信息。如果各位这样想就大错特错了。提示一下,如果攻击者有CREATE TABLE的权限,那么创建一个临时表,然后将信息INSERT到表中,然SELECT出来,接着跟数字进行比较,让SQL SERVER报错,那么结果就全出来了……所以我们要报着宁错杀,不放过的态度进行修补。

先来列出危险的内置存储过程:

xp_cmdshell
xp_regaddmultistring
xp_regdeletekey
xp_regdeletevalue
xp_regenumkeys
xp_regenumvalues
xp_regread
xp_regremovemultistring
xp_regwrite

ActiveX自动脚本:

sp_OACreate
sp_OADestroy
sp_OAMethod
sp_OAGetProperty
sp_OASetProperty
sp_OAGetErrorInfo
sp_OAStop

以上各项全在我们封杀之列,例如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的攻击者将它进行恢复。

我们做到这儿,你的SQL SERVER就基本上安全了。但是信息还是能一样的外泄。毕竟SELECT我们是无法取消的,除非你的网站用的是HTML。SQL INJECTION的防范还需要我们这些程序员来注意,这才是治本之法。我们在高级设置篇再接着对SQL SERVER的安全做下一步的分析。该篇文章如果有什么错漏,请大家多多包涵。谢谢……

另外推荐一下,SQL INJECTION的测试工具NBSI2,这是由联盟中小竹同志开发,对SQL INJECTION的注入有代表性的作用,另外一个就是小弟的NBWEBSHELL了。这些工具都可以到联盟网站进行下载

NB联盟-jadesun(裤衩) QQ:280155
NB网站:www.54nb.com





SQL注入防御方法-程序员篇

  SQL注入越来越多的被利用来入侵网站,部分WEB程序员也开始关注这方面的知识,但由于对入侵的方法一知半解,导致在过滤的时候漏掉某些字符,造成安全漏洞;或者是草木皆兵,把一些合法的用户请求都拒之门外,试想一下,当用户想输入个I'm a boy的时候,却给你臭骂一顿,他还会愿意再上你的网站吗?

下面,我从程序方面介绍一下SQL注入的防御方法,首先看这三句最简单SQL语句
1.SQL="Select * from Users where UserID=" & Request("ID")
2.SQL="Select * from Users where UserID='" & Request("ID") & "'"
3.SQL="Select * from Users where UserName like '%" & Request("Name") & "%'"

第一句,参数是数字型,这个很明显。第二句,如果字段UserID是int型,就有些人分不清楚了。其实,区分第数字弄和字符型参数,只要看SQL语句参数两边有没有单引号即可,很明显,第一句没单引号,是数字型;第二第三句有单引号,是字符型。

  对于数字型变量,传入的参数都会直接附加到SQL语句上执行,而因为参数是数字型,所以用isNumeric判断是很安全的,我曾经试过用\0之类试图断开参数,但结果都是失败。

  对于字符型变量,传入的参数都是做为常量,比如你传1 and 1=1进去,SQL语句就是UserID='1 and 1=1',在单引号界定范围里面的值永远都只是一个常量,要打破这个范围,唯一的字符就是界定的字符:单引号。所以,字符型变量只要过滤了'号就完全安全了,至于如何过滤,最好是把一个单引号替换成两个单引号,因为SQL语句里面规定,'常量'这样表示的常量里面,常量里面如果要有单引号,可以用两个单引号代替。这样,既可以保持用户输入的原貌,又可以保证程序的安全。

  下面是两个函数,大家可以Copy过去直接调用就行了。

'---------------------------------------------------------------
' NB联盟防注入函数 ReqNum / ReqStr
'---------------------------------------------------------------
Function ReqNum ( StrName )
ReqNum = Request ( StrName )
if Not isNumeric ( ReqNum ) then
Response.Write "参数必须为数字型!"
Response.End
End if
End Function

Function ReqStr ( StrName )
ReqStr = Replace ( Request(StrName), "'", "''" )
End Function

以上面三句SQL语句,说明一下调用方法:
1.SQL="Select * from Users where UserID=" & ReqNum("ID")
2.SQL="Select * from Users where UserID='" & ReqStr("ID") & "'"
3.SQL="Select * from Users where UserName like '%" & ReqStr("Name") & "%'"

  重申一点:上面的方法无论对SQLServer库还是Access或是其它数据库,都是绝对适用、绝对安全,但注意一点,SQLServer的存储过程是个例外,该情况下要把单引号替换成四个单引号,以保安全。
评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
无门无派无资料,号称三无,自由自在!
离线LOVE风风
发帖
268
祝福宝石
0
威望
0
玛雅之石
0
创造宝石
0
只看该作者 沙发  发表于: 2006-08-22
再来一篇,基本上设置差不多,多掌握点基本知识吧

  一.引言

  随着网络的普及和发展,基于Internet的各种系统也在各行各业中发挥着日益重要的作用。但由于计算机网络具有连接形式多样性、终端分布不均匀性和网络的开放性、互联性等特征,致使WEB系统易受黑客,恶意软件和其它不轨行为的攻击。而且,当其中涉及有关个人身份的隐私资料,或公司、学校等各种团体的敏感数据,甚至商业数据时,提高网络安全性尤为重要。本文将以WEB系统中的典型配置(Win2000 server+SQL+IIS5.0)为例,着重讨论WEB服务器的系统安全设置与SQL Injection的安全策略。

  二.网络安全隐患分析及安全技术

  通常,我们所说的网络安全是指:网络系统的硬件、软件及其系统中的数据受到保护,不会因为偶然或者恶意的攻击而遭到破坏、更改、泄漏,系统能够连续、可靠、正常地运行,网络服务不中断。因此,通常网络安全包括了系统安全和数据安全两个部分。同样,对网络地恶意攻击行为也可大致分为系统型攻击和数据型攻击。在网络安全中,各种硬件设施,防火墙都是必不可少的。除此之外,系统的安全设置及代码的数据安全性也是其中不可忽视的一部分,本文将对此作深入的讨论。具体分析如下:

  1.系统安全设置

  以Windows 2000 server + SQL Server 2000 + IIS5.0为例:相对而言,这是我们最常用的网络服务器配置。但是微软的漏洞层出不穷,补丁一个接一个。因此,加固系统安全就显得异常重要。

  首先,应尽可能选择专用的Web Server服务器,在安装系统时应断开服务器的网络连接,并在此基础上安装Service Pack 3的补丁程序。打完补丁后修改注册表,首先禁止默认共享。在Windows 2000中,有一个“默认共享”,这是在安装服务器的时候,把系统安装分区自动进行共享,虽然对其访问还需要超级用户的密码,但这是潜在的安全隐患,从服务器的安全考虑,最好关闭这个“默认共享”,以保证系统安全。将键值: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters\autoshareserver修改为0。

  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters\ autosharewks修改为0。如果没有这两个键值,新建即可。注意,新建时选择“双字节值”。此外应禁止IPC$空连接,将键值 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\restrictanonymous修改为1。

  IPC$(Internet Process Connection)是为了让进程间通信而开放的命名管道,可以通过验证用户名和密码获得相应的权限,在远程管理计算机和查看计算机的共享资源时使用。利用IPC$,连接者甚至可以与目标主机建立一个空的连接而无需用户名与密码(当然,主机必须开了ipc$共享,否则是连接不上的),而利用这个空的连接,连接者还可以得到目标主机上的用户列表。

  其次,针对IIS,要尽量避免把IIS安装在网络中的主域控制器上。因为在安装完IIS后,会在所安装的计算机上生成IUSR_Computername的匿名账户。这个账户会被添加到域用户组中,从而把应用于域用户组的访问权限提供给访问Web服务器的每个匿名用户,这样不仅不能保证IIS的安全性,而且会威胁到主域控制器。在安装完后,应运行IISLOCKD.EXE,该软件是微软发行的用于填补IIS漏洞的软件。但这并不足以保证IIS的安全,应对IIS做进一步的加固:

  a.删除和停用IIS的示范程序和目录,这是IIS自带的程序和文件,也是进攻者对web系统进行攻击的一个途径。


表1


条目 位置
IIS ?\Inetpub\iissamples
Admin Scripts ?\Inetpub\AdminScripts
IIS Documentation %systemroot%\help\iis help
Data Access ?\Program Files\commonfiles\system\msadc




  b.为防止进攻者利用服务器的FTP设置和发送MAIL的功能对网站内容进行修改,如果服务器不需要FTP和发送MAIL, 可以删掉ftproot和mailroot 两个文件夹,并关掉相关服务。

  c.为避免日志文件被修改或覆盖,需要设置IIS日志文件的访问控制权限:默认情况下,IIS的日志会在“%systemroot%\system32\logfiles”目录下。如果可能,可以将日志的路径换一个地方。推荐访问控制权限:Administrators (Full Control) ;System (Full Control) ;Everyone (RWC). 这个步骤将防止一些有恶意的用户通过删除日志信息来掩盖他的记录。

  d.删除危险的脚本影射:例如:对.htr文件的映射,请求处理存在堆溢出漏洞,远程攻击者可以利用此漏洞得到主机本地普通用户访问权限。而对idq.dll,在处理某些URL请求时存在一个未经检查的缓冲区,如果攻击者提供一个特殊格式的URL,就可能引发一个缓冲区溢出。通过精心构造发送数据,攻击者可以改变程序执行流程,执行任意代码。成功地利用这个漏洞,攻击者可以远程获取"Local System"权限。因此,删除一些并不需要的脚本影射,可以将利用漏洞攻击的可能性降至最低:


表2

脚本类型 映射
Web-based password reset .htr
Internet Database Connector .idc
Server-Side Includes .stm .shtml .shtm
Internet Printing .printer
Index Server .ida .idq .hta




  2.数据攻击

  以下主要总结了针对SQL Injection 的安全防范策略及对SQL Server的设置。所谓SQL Injection,就是指利用某些数据库的外部接口把用户数据插入到实际的数据库操作语言当中,从而达到入侵数据库乃至操作系统的目的。在利用Web 脚本语言(ASP,PHP)做前台+数据库做后台的WEB系统中,为达到与用户交互的目的,就不可避免的有一些东西是来自用户提交的信息,如用户的登陆信息,查询字符串,或用户可以远程修改的资料等等。这些信息往往可能被攻击者利用,将SQL语句篡改成其它组合语句,以达到其攻击目的。

  这里,我们举一个简单的例子:

  dim conn
dim rst
username=request.querystring("username")
password=request.querystring("password")
set conn=Server.CreateObject("ADODB.Connection")
conn.open strConn '数据库连接字符串略
set rst=conn.execute("select * from login where username='" & username & "' and password='"
& password "'")
if not rst.eof then
response.write "log in"
else
response.write "failed"
end if
rst.close
conn.close


  其中,实施SQL Injection的关键代码如下:set rst=conn.execute("select * from login where username='" & username & "' and password='" & password "'")
  在数据库中,我们在表login中定义username=user , password= pwd。如果在登录界面输入正确,则username , password 嵌入到SQL语句中,组成的URL为:http://localhost/test.asp ? username=username&password=password
  如果,入侵者提交这样的URL又会怎样呢?http://localhost / test.asp ? username=username&password=any ‘or 1=1--
  结果,组成的SQL为:select * from login where username='username' and password='any' or 1=1--'
  而1=1永远成立,--后面的东西将被忽略。所以,不管正确的密码是什么,这个语句返回的都将是login. 这就是最典型的SQL Injection,也是较为简单的一种。SQL Injection的威胁性也不止于此,还有诸如:得到后台数据库信息、读取数据库中的数据,甚至获取系统信息,修改注册表等。根据以上特点,我们提出如下的防范措施:

  首先,SQL Injection通常在与用户交互时发生,那么对用户的输入进行严格的过滤是非常重要的,尤其是对单引号、双引号以及“??”等符号。而且不仅是对QUERY_STRING环境变量的过滤,还要对所有的表单提交的数据以及用户可以通过修改来控制的下拉菜单、按钮等所有的交互数据进行过滤。同时,考虑到很多恶意的攻击可能会结合一些数据的组合来绕开这种过滤方法。因此,可以采用一种更安全的方法,进行一些安全替换等。比如:将单引号替换为两个单引号input = replace (input,” ’ ”,” ’ ’ ”)但是,仅从程序的角度来过滤是不够的,还需要结合其它的安全手段,比如:使用防火墙过滤掉进入80端口的单引号、双引号以及“??”等特殊符号。此外,还要对SQL Server 进行必要的安全配置,删除一些存储过程:

  1.直接运行系统命令的存储过程:xp_cmdshell 。xp_cmdshell是进入操作系统的最佳捷径,是数据库留给操作系统的一个大后门。

  2. 删除访问注册表的存储过程,某些注册表存储过程甚至能够读出操作系统管理员的密码来:xp_regaddmultistring, xp_regdeletekey, xp_regdeletevalue, xp_regenumvalues, xp_regread, xp_regremovemultistring, xp_regwrite 。

  3.OLE存储过程:Sp_OACreate, Sp_OADestroy, Sp_OAGetErrorInfo, Sp_OAGetProperty, Sp_OAMethod, Sp_OASetProperty, Sp_OAStop

  4.其他有一定安全隐患的存储过程:如xp_servicecontrol, xp_stopmail, xp_startmail, xp_perfmonitor, xp_unc_to_drive, xp_perfend, sp_sdidebug, xp_availablemedia, xp_deletemail, xp_dirtree, xp_dropwebtask, xp_dsninfo,等。

  其实在多数应用中根本用不到多少系统的存储过程,而SQL Server的这么多系统存储过程只是用来适应广大用户需求的,所以请删除不必要的存储过程,因为有些系统的存储过程能很容易地被人利用起来提升权限或进行破坏。在删除这些存储过程的之前,先备份。如果系统不能正常运行,则恢复它。
无门无派无资料,号称三无,自由自在!
离线sky0520
发帖
327
祝福宝石
0
威望
0
玛雅之石
0
创造宝石
0
只看该作者 板凳  发表于: 2006-08-22
精彩~受教了
离线chbin
发帖
712
祝福宝石
0
威望
0
玛雅之石
0
创造宝石
0
只看该作者 地板  发表于: 2006-08-22
呵呵,楼主真太强了,搞的不错嘛
离线liba___1
发帖
136
祝福宝石
0
威望
0
玛雅之石
0
创造宝石
0
只看该作者 4楼 发表于: 2006-08-22
sql server 2000 早就有sp4了.....很早很早的说......
离线LOVE风风
发帖
268
祝福宝石
0
威望
0
玛雅之石
0
创造宝石
0
只看该作者 5楼 发表于: 2006-08-22
引用第4楼liba___12006-08-22 15:43发表的“”:
sql server 2000 早就有sp4了.....很早很早的说......

恩,是的,这份资料是我开0.97的时候整理的,所以就没改,直接发布出来了,呵呵。。
无门无派无资料,号称三无,自由自在!
快速回复
限100 字节
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
上一个 下一个

      管理员联系信箱 [email protected] 所有内容均来之互联网,如侵犯您的隐私和权益,请和我们及时联系!