“填充甲骨文”:动画入门读本

2020-09-01 01:05:06

作为CTF的一部分,我最近遇到了一个有趣的小填充式甲骨文攻击,在网上几乎没有找到概述该攻击的文章。在我找到的文章中,大多数要么讨论了攻击(贵宾犬)的具体实例,要么描述了很难理解的冗长的数学运算序列。在这篇文章中,我想对这次攻击进行一个不同的、更直观的描述,希望有些人会觉得它有用,更容易理解。

在讨论填充先知之前,我们需要先谈谈密码模式和块密码。我们在示例中将使用的密码是Rijndael分组密码,它是高级加密标准(AES)的一部分。块密码是对固定长度的比特组(块)进行操作的算法。这与流密码形成对比,在流密码中,每个比特一次加密一个。由于块密码仅适用于单个固定长度的消息,因此需要额外的步骤来加密或解密比一个块更长(或更短)的消息。密码模式算法描述如何重复应用单块操作,以安全地加密或解密大于单个块的消息。

填充先知通常与在密码块链接(CBC)模式下操作的块密码相关联。在CBC模式下,每个明文块在加密之前与前一个块混合。这防止了与更简单的电子码本(ECB)模式相关的信息泄漏。在ECB模式中,每个块使用相同的密钥加密,因此相同的明文总是加密为相同的密文。这意味着明文中存在的模式可能仍然存在于密文中。我们可以在下面比较ECB和CBC模式的图片中看到这一点。

现在我们了解了不同的加密模式,我们可以开始探索消息是如何加密的,然后进入解密阶段,在该阶段中,我们的填充Oracle将使我们能够在不知道密钥的情况下解密消息。

放到填充物的神谕上。CBC模式密码的解密过程是解密所有块,验证并删除填充,然后返回明文。服务器如何根据无效填充做出响应将决定我们是否可以执行攻击。

填充先知攻击利用解密的填充验证步骤,以便在不知道密钥的情况下解密消息。该攻击依赖于有一个填充先知来揭示消息是否正确填充。通常,这将是解密服务器以详细的错误消息响应,指示填充无效。然而,其他渠道也是可能的。例如,如果消息被错误填充,服务器可能需要更长的时间来回复,只要可以推断消息是否被正确填充,就可以执行攻击。

现在我们知道了在填充Oracle中寻找的是什么,我们可以遍历消息的解密过程并执行填充Oracle攻击。

那么我们能做些什么来防止这次袭击呢?显而易见的解决办法是不透露消息是否被正确填充。然而,这说起来容易做起来难。如果消息无法解密,则提供一般性错误将消除任何明显的填充先知。但是,基于时间的填充先知更难检测和预防。在基于定时的填充预言机中,服务器可能花费明显不同的时间量来处理来自错误填充消息的正确填充消息,而不是指示无效填充的错误消息。然后,服务器需要多长时间才能做出响应,就可以用来确定消息是否正确填充。

更好的方法是加密消息,然后附加消息验证码(MAC)来验证密文的完整性。然后,在进行任何解密之前,服务器会对MAC进行验证。如果验证失败,则表明消息已被篡改。然后,服务器可以拒绝继续解密该消息。这确保了无论实现细节(如计时和错误消息)如何,都不会填充Oracle。

希望这有助于更好地解释填充甲骨文。以及说明了解如何正确实现密码是多么重要,因为一个小错误就会很快使其崩溃。有趣的是,这种技术不仅限于解密。填充先知也可以在不知道密钥的情况下伪造有效的密文,但我将把它留给读者作为练习。如果您曾经看到一个假设加密值不能被篡改的系统(会话令牌是好的),不要忘记检查填充的先知。

如果您有兴趣了解更多信息,请查看下面的链接。在我写这篇文章的时候,他们真的帮了我很大的忙。