hacktricks/cryptography/electronic-code-book-ecb.md
2023-08-03 19:12:22 +00:00

6.7 KiB
Raw Blame History

☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

ECB

(ECB) 电子密码本 - 对称加密方案,它通过将明文的每个块替换为密文的块来进行加密。这是最简单的加密方案。主要思想是将明文分成N位的块(取决于输入数据块的大小、加密算法),然后使用唯一的密钥对每个明文块进行加密(解密)。

使用ECB有多个安全隐患

  • 加密消息的块可以被删除
  • 加密消息的块可以被移动

漏洞的检测

假设你多次登录一个应用程序,每次都得到相同的cookie。这是因为应用程序的cookie是**<用户名>|<密码>
然后,你生成了两个新用户,他们的
密码相同且几乎相同的用户名**。
你发现两个用户信息相同的8字节块相等的。于是,你猜测可能是因为使用了ECB

就像下面的例子一样。观察这2个解码的cookie中多次出现的块**\x23U\xE45K\xCB\x21\xC8**

\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8\x04\xB6\xE1H\xD1\x1E \xB6\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8+=\xD4F\xF7\x99\xD9\xA9

\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8\x04\xB6\xE1H\xD1\x1E \xB6\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8+=\xD4F\xF7\x99\xD9\xA9

这是因为这些cookie的用户名和密码中多次包含字母"a"(例如)。不同的块是包含至少一个不同字符的块(可能是分隔符"|"或用户名中的某些必要差异)。

现在,攻击者只需要发现格式是<用户名><分隔符><密码>还是<密码><分隔符><用户名>。为了做到这一点,他可以生成几个相似且较长的用户名和密码,直到找到格式和分隔符的长度:

用户名长度 密码长度 用户名+密码长度 解码后的Cookie长度
2 2 4 8
3 3 6 8
3 4 7 8
4 4 8 16
7 7 14 16

漏洞的利用

删除整个块

知道cookie的格式<用户名>|<密码>)后,为了冒充用户名admin,创建一个名为aaaaaaaaadmin的新用户获取并解码cookie

\x23U\xE45K\xCB\x21\xC8\xE0Vd8oE\x123\aO\x43T\x32\xD5U\xD4

我们可以看到之前使用只包含a的用户名创建的模式\x23U\xE45K\xCB\x21\xC8。 然后您可以删除前8B的块这样您就可以得到一个有效的用于用户名admin的cookie

\xE0Vd8oE\x123\aO\x43T\x32\xD5U\xD4

移动块

在许多数据库中,搜索WHERE username='admin';WHERE username='admin ';(注意额外的空格)是相同的。

因此,模拟用户admin的另一种方法是:

  • 生成一个用户名:len(<username>) + len(<delimiter) % len(block)。使用块大小为8B,可以生成名为username 的用户名,使用分隔符|,块<username><delimiter>将生成2个8B的块。
  • 然后,生成一个密码,该密码将填充包含我们想要模拟的用户名和空格的确切块数,例如:admin

该用户的cookie将由3个块组成前两个块是用户名+分隔符的块,第三个块是密码(伪装成用户名):username |admin

然后,只需将第一个块替换为最后一个块,就可以模拟用户adminadmin |username

参考资料

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥