Microsoft IIS ssinc.dll缓冲区溢出漏洞发布时间:2001-08-18 更新时间:2001-08-18 严重程度:高 威胁程度:权限提升 错误类型:输入验证错误 利用方式:服务器模式 受影响系统 Microsoft IIS 4.0详细描述 NSFOCUS安全小组发现微软IIS 4.0/5.0所带的一个动态链接库(ssinc.dll)在处理包含文 件时存在一个缓冲区溢出漏洞,攻击者可能利用这个漏洞获取SYSTEM权限。 微软IIS支持SSI(Server Side Include)功能。ssinc.dll就是一个SSI解释器。默认情况 下,扩展名 .stm、.shtm 和 .shtml 被映射到解释程序(Ssinc.dll)。 SSI支持"#include"指令,通常的使用方式是: <!--#include file="文件名"--> ssinc.dll在处理"#include"指令时,会将shtml文件所在的目录名加在包含文件的前面形 成一个新的字符串。 例如: 创建一个"test.shtml"文件,将其保存在"wwwroot/abcd/"目录下。"test.shtml"的内容如下: <!--#include file="ABCD"--> 那么生成的新字符串就是"/abcd/ABCD"。ssinc.dll会将这个字符串拷贝到一个0x804(2052) 字节长的缓冲区去。 ssinc.dll在从test.shtml中获取包含文件名时,检查了包含文件名的长度,如果发现超 过0x801字节,就截断为0x801字节,并在末尾添加'\0'。这样,包含文件的名字最长为0x802 (2550)字节,包括最后的'\0'。 但是,它没有检查在增加了当前目录名后的新字符串的长度。因此,如果将包含文件名设 置成一个超过0x801字节的字符串,并将"test.shtml"放到一个长度为9字节的目录中,那 么新字符串的总长度就会是 9 + 2(两个'/'字符) + 0x801 = 0x80C (2060)字节 这将触发一个缓冲区溢出,完全覆盖堆栈中保存的EIP(末尾的'\0'将会覆盖第一个形参)。 这时ssinc.dll运行在SYSTEM环境下,如果攻击者小心地构造溢出数据,就可能改变程序 流程,并以SYSTEM权限执行任意代码。 攻击者要进行攻击需要有两个条件: 1. 攻击者需要有权限在web目录下创建文件或目录。 2. 攻击者需要能够通过web服务访问创建的文件。 测试代码 1. 创建一个文件名为"test.shtml",文件内容包括如下内容: <!--#include file="AAAA[...]AA"--> 'A'的数目应该大于2049个。 2. 在web根目录下创建一个目录,例如"a"。 将"test.shtml"拷贝到"a"目录下 3. 通过web浏览器请求"test.shtml": http://webhost/a/test.shtml 4. IIS会返回一个空白页面,这说明溢出已经发生了。这时实际上只是用末尾的'\0'覆盖 了EBP的最后一个字节。 作为对照,如果将包含文件的名字设置为一个较短的名字,例如'AA'。 发送请求时,IIS会返回处理 SSI 文件 '/a/AA' 错误的信息。 解决方案 临时解决方法: 1、禁止不可信用户对web目录拥有写权限 2、如果您不需要SSI功能,删除.shtml、.shtm、.stm映射 厂商补丁: 微软已经为此发布了一个安全公告(MS01-044)以及相应补丁程序: http://www.microsoft.com/technet/security/bulletin/MS01-044.asp 补丁下载: Microsoft IIS 4.0: http://www.microsoft.com/Downloads/Release.asp?ReleaseID=32061 Microsoft IIS 5.0: http://www.microsoft.com/Downloads/Release.asp?ReleaseID=32011 注:上述补丁是补丁合集,包含了绝大多数IIS漏洞的补丁,因此我们建议用户尽快下载并安装这些补丁。 相关信息 <*来源:Nsfocus Security Team (security@nsfocus.com) 中联绿盟安全公告(SA2001-06):http://www.nsfocus.com/sa01-06.htm 微软安全公告MS01-044: http://www.microsoft.com/technet/security/bulletin/MS01-044.asp *> |