微软SQL Server/MSDE 扩展存储过程缓冲区溢出漏洞发布时间:2000-12-11 更新时间:2000-12-11 严重程度:高 威胁程度:远程管理员权限 错误类型:输入验证错误 利用方式:服务器模式 受影响系统 受影响的系统:详细描述 在微软SQL Server 7.0/2000以及MSDE中以及提供了一个API函数srv_paraminfo (),它用来为扩展存储过程调用解释输入参数。由于它没有对输入参数长度进行 检查,因此如果输入参数长度超过一定限制,就可能发生缓冲区溢出。任何在调 用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) 给第一个参数传递超长的串将导致非法操作并覆盖异常处理程序所保存的返 回地址。 扩展存储过程可以被任何客户组件调用,只要这些客户组件能够执行普通的SQL Server查询,比如Microsoft Access或者MSQuery。SQL Server中提供的ISQL实 用程序也可以用来调用扩展存储过程。运行于IIS之上的web应用程序频繁地使用 ADO(ActiveX Data Objects)API来连接SQL Server数据库。 攻击者可能通过两种途径进行攻击: 1. 如果攻击者可以登录进入SQL Server数据库,就可以通过直接调用有问题的 扩展存储过程来进行攻击。如果溢出成功,可能获取SYSTEM权限。 2. 攻击者也可能通过Web应用程序来进行攻击,但是需要攻击者了解应用程序 在何处调用了有问题的扩展存储过程,同时提供有效的参数。 <* 来源:Chris Anley(dec0de@atstake.com) David Litchfield (dlitchfield@atstake.com) Microsoft Security Bulletin (MS00-092): http://www.microsoft.com/technet/security/bulletin/MS00-092.asp *> 测试代码 可以下载下面的测试代码: http://www.atstake.com/research/advisories/2000/sqladv2-poc.c http://www.atstake.com/research/advisories/2000/sqladv-poc.c 解决方案 微软已经发布如下补丁以消除本漏洞: http://support.microsoft.com/support/sql/xp_security.asp 相关信息 |