Web服务器软件的形式各异,包括仅用于显示静态页面的极其简单的轻量级软件,以及能够处理各种任务、提供除业务逻辑本身以外的所有功能的高度复杂的应用程序平台。就后者而言,人们大多认为这类框架是安全的。以前,Web服务器软件被一系列严重的安全漏洞所困扰,使得攻击者能够执行任意代码、窃取文件和提升权限。这些年来,主流Web服务器平台已变得日渐可靠。许多情况下,核心功能仍保持静态,甚至经过精简,因为供应商有意减少默认的受攻击面。但是,即使这些漏洞越来越少,其背后的原理仍然适用。在本书第1版中,我们提供了一些最有可能包含漏洞的服务器软件示例。自第1版出版以来,人们在各类软件(通常为并行技术或服务器产品)中均发现了新的漏洞。除一些小型个人Web服务器及其他次要目标外,这些新漏洞大多存在于以下软件之中:
IIS和Apache中的服务器端扩展。
从头开发的新型Web服务器,这类服务器主要用于支持特定的应用程序,或作为开发环境的一部分提供。它们可能较少受到现实世界中的黑客的关注,因而更可能存在上述问题。
多年以来,Web应用程序框架一直存在各种严重的缺陷。我们将介绍最近在某个框架中发现的一个常见缺陷,这个缺陷导致在该框架上运行的许多应用程序都易于受到攻击。
.NET填充提示
.NET中的“填充提示”(padding oracle)漏洞是近年来最为著名的漏洞。.NET对CBC分组密 码使用PKCS #5填充,其操作方式如下。
分组密码基于固定的分组大小进行操作,在.NET中,这样的分组通常为8或16字节。.NET采用PKCS #5标准为每一个明文字符串添加填充字节,以确保生成的明文字符串长度可以被分组大小整除。这时,.NET不是使用任意值进行填充,选择用于填充的值是填充字节的数量。每个字符串都会被填充,如果初始字符串是分组大小的倍数,将填充整个分组。因此,如果分组大小为8,则必须使用1个0x01字节、2个0x02字节,或最多8个0x08字节的任意组合进行填充。然后,将第一条消息的明文与称为初始化向量(IV)的预设消息分组进行XOR运算。(回顾我们在第7章讨论的在密文中选择模式时遇到的问题。)如第7章所述,接下来,第二条消息将与第一条消息的密文进行XOR运算,从而开始循环分组链。
整个.NET加密过程如下。
(1)选择明文消息。
(2)使用所需的填充字符数作为填充字节值填充该消息。
(3)将第一个明文分组与初始化向量进行XOR运算。
(4)使用三重DES加密从第3步的XOR运算得到的值。
从这时开始,将循环执行以下步骤,以加密剩余的消息(这就是第7章介绍的密码块链(CBC)过程)。
(5)将第二个明文分组与加密后的前一个分组进行XOR运算。
(6)使用三重DES加密XOR运算得到的值。
填充提示
在2010年9月之前,易受攻击的.NET版本包含一个看似无害的信息泄露漏洞。如果在消息中发现填充错误,应用程序会报告错误,向用户返回500 HTTP响应码。如下所述,组合利用PKCS#5填充算法和CBC的上述行为,攻击者可以攻破整个.NET安全机制。
请注意,为了发挥效用,所有明文字符串应包含至少一字节的填充信息。此外还要注意,看到的第一个密文分组为初始化向量;该向量的唯一用途,是与消息的第一个加密分组的明文值进行XOR运算。为实施攻击,攻击者将向应用程序提交一个仅包含前两个密文分组的字符串。这两个分组分别为IV及第一个密文分组。然后,攻击者提交一个仅包含数字零的IV,并通过逐步递增该IV的最后一个字节,提出一系列请求。该字节将与密文中的最后一个字节进行XOR运算,除非针对该字节生成的值为0x01,否则加密算法将抛出错误!(前面我们讲过,任何字符串的明文值必须以一个或多个填充值结尾。由于第一个密文分组中不存在任何其他填充值,因此最后一个值必定被加密为0x01。)
攻击者可以利用以下错误条件——最终他会得到这样的值:如果将该值与密文分组的最后一个字节进行XOR运算,结果为0x01。这时,将可以确定最后一个字节y的明文值,因为:
因此,我们也由此确定x的值。
以上过程同样适用于密文中的倒数第二个字节。这次,在已知y值的情况下,攻击者将选择x 的值(该值的最后一个字节将解密为0x02)。然后,他对初始化向量中的倒数第二个字符执行以上递归过程,并收到500 Internal Server Error消息,直到倒数第二个解密的字节为0x02。这时,消息末尾存在两个0x02字节,这是有效的填充,因而不会返回任何错误。然后,可以对目标分组中的所有数据位、随后的密文分组,以及消息中的所有分组递归应用同样的过程。
这样,攻击者即可以解密整条消息。有趣的是,攻击者还可以采用同样的机制来加密消息。恢复一个明文字符串后,就可以修改IV来生成所选的明文字符串。ScriptResource.axd是一个最佳攻击目标。ScriptResource的d参数是一个加密的文件名。如果攻击者选择web.config作为文件名,将能够获得具体的文件,因为ASP.NET会避开IIS实施的有关文件处理方面的常规限制。例如:
注解
一般而言,以上攻击适用于任何使用PKCS #5填充的CBC密码。此类攻击最初于2002年为人们所知,它的主要目标为.NET,因为.NET对会话令牌、ViewState和ScriptResource.axd使用PKCS #5填充。请访问www.iacr.org/archive/eurocrypt2002/23320530/cbc02_e02d.pdf查阅讨论这种攻击的原始论文。