http://mdsec.net/auth/363/
2.CBC密码
鉴于ECB密码存在明显的缺陷,于是人们开发出了密码块链(CBC)密码。使用CBC密码时,在加密每个明文分组之前,将它与前一个密文分组进行XOR运算,如图7-5所示。这样,同一个明文分组就不会被加密成同一个密文分组。解密时逆向执行XOR运算,每个解密的分组将与前一个密文分组进行XOR运算,以恢复原始的明文。
图7-5 使用CBC密码时,在加密每个明文分组之前,将它与前一个密文分组进行XOR运算
由于使用CBC密码可以避免使用ECB密码造成的某些问题,因此,CBC模式经常使用标准对称加密算法,如DES和AES。但是,由于Web应用程序经常使用CBC加密的令牌,这意味着攻击者不需要了解密钥就可以操纵解密令牌的某些部分。
下面我们对上一个包含几个不同的有意义组件(包括一个数字用户标识符)的应用程序令牌稍做修改:
和前面一样,加密这段信息后,将生成一个明显无意义的令牌:
由于这个令牌是使用CBC密码加密的,因此,在解密该令牌时,将对每个密文分组与下一个解密的文本块进行XOR运算,以获得明文。现在,如果攻击者修改密文(他收到的令牌)的某些部分,将导致特定的分组被解密成乱码。但是,这也导致下一个解密的文本块将与不同的值进行XOR运算,从而生成经过修改但仍有意义的明文。换言之,通过操纵令牌中的某个分组,攻击者能够修改它之后的分组的解密内容。如果应用程序以危险的方式处理生成的解密令牌,攻击者将能够切换到其他用户或提升自己的权限。
为什么会出现这种情况呢?在上述示例中,攻击者对加密的令牌进行修改,每次以任意方式更改一个字符,并将修改后的令牌发送给应用程序。在这个过程中,攻击者会提出大量请求。应用程序对每个修改后的令牌进行解密后生成的部分值如下所示:
在每一个值中,如我们预料的那样,攻击者修改的分组被解密成乱码(以????????表示)。但是,之后的分组被解密成有意义的文本,只是与原始令牌略有不同。如前所述,出现这种不同,是因为解密的文本与前一个密文分组进行了XOR运算,而攻击者已对该密文分组进行了略微修改。
虽然攻击者看不到解密的值,但应用程序会尝试处理这些值,随后攻击者会在应用程序的响应中看到处理结果。具体来说,接下来会出现什么情况,取决于应用程序如何处理经过修改的解密令牌。如果应用程序拒绝包含任何无效数据的令牌,攻击将会失败。但是,以这种方式使用令牌的应用程序通常仅查看解密令牌的某些部分,如用户标识符。如果应用程序这样处理令牌,那么,上面列表中的第八个分组将能够成功实施攻击,应用程序将处理攻击者提出的请求,并认为用户的uid为226,而不是最初的216。
使用Burp Intrude冲的“位翻转程序”(bit flipper)有效载荷类型,可以轻松测试出应用程序是否存在这方面的漏洞。首先,需要使用你自己的账户登录应用程序。然后,找到一个使用已登录会话并在响应中显示已登录用户标识符的应用程序页面,通常是用户的“主登录”页或“账户详细资料”页。图7-6显示了如何将Burp Intruder设置为针对用户的主页,其中的加密会话令牌被标记为有效载荷位置。
图7-6 将Burp Intruder配置为修改加密会话令牌
所需的有效载荷配置如图7-7所示。它指示Burp处理令牌的原始值,将其视为ASCII编码的十六进制代码,并“翻转”每个字符位置的每个数据位。这种方法非常理想,因为只需要提交较小 数量的请求(令牌中的每个字节8个请求),并且几乎总是能够确定应用程序是否易于受到攻击。这样就可以采用更有针对性的攻击,对应用程序的漏洞加以利用。
图7-7 将Burp Intruder配置为“翻转”加密令牌中的每个位
实施攻击时,最初的请求并不会导致应用程序的响应产生任何明显的变化,用户的会话也未遭到修改。这本身就值得我们注意,因为这表示令牌的第一部分并未用于确定登录用户。攻击过程中随后提交的许多请求导致应用程序重定向到登录页面,这说明所做的修改已导致令牌失效。关键在于,还存在一些请求,其响应似乎是有效会话的一部分,但实际上与原始的用户标识符无关。这些请求与包含uid的令牌分组对应。某些情况下,应用程序仅显示“未知用户”,表示经过修改的uid没有对应的实际用户,因此攻击将会失败。其他情况下,应用程序会显示其他注册用户的名称,这说明攻击已取得成功。攻击结果如图7-8所示。我们在其中定义了一个“提取grep”列来显示登录用户的标识符,并设置过滤器来隐藏将应用程序重定向到登录页面的响应。
确定存在的漏洞后就可以通过更有针对性的攻击来利用该漏洞。为此,需要从结果中确定,如果用户的资料发生变化,加密令牌中的哪个数据块会发生变化。然后,再实施攻击以测试这个数据块中的其他值。这时,可以使用Burp Intrude冲的“数字”有效载荷类型。