如何正确地使用加密与认证技术(3)
0x03 如何攻击未经认证的加密
比方说,在登录到这个应用程序之后,你会发现你收到一个会话cookie,看起来就像
kHv9PAlStPZaZJHIYXzyCnuAhWdRRK7H0cNVUCwzCZ4M8fxH79xIIIbznxmiOxGQ7td8LwTzHFgwBmbqWuB+sQ==
让我们改变一个字节的第一块(初始化向量),并反复发送我们的新的cookie,直到出现一些变化。应该采取共4096次HTTP请求,以尝试变量IV所有可能的单字节变化。在上面的例子中,经过2405次请求后,我们得到一个看起来像这样的字符串:
kHv9PAlStPZaZZHIYXzyCnuAhWdRRK7H0cNVUCwzCZ4M8fxH79xIIIbznxmiOxGQ7td8LwTzHFgwBmbqWuB+sQ==
相比之下,在base64编码的cookie中只有一个字符不同(kHv9PAlStPZaZ J vs kHv9PAlStPZaZ Z):
- kHv9PAlStPZaZJHIYXzyCnuAhWdRRK7H0cNVUCwzCZ4M8fxH79xIIIbznxmiOxGQ7td8LwTzHFgwBmbqWuB+sQ==
+ kHv9PAlStPZaZZHIYXzyCnuAhWdRRK7H0cNVUCwzCZ4M8fxH79xIIIbznxmiOxGQ7td8LwTzHFgwBmbqWuB+sQ==
我们存储在这个cookie里的原始数据,是看起来像这样的数组:
array(2) {
["admin"]=>
int(0)
["user"]=>
"aaaaaaaaaaaaa"
}
但在仅仅改变初始化向量的一个字节之后,我们就能够改写我们的阅读信息:
array(2) {
["admin"]=>
int(1)
["user"]=>
"aaaaaaaaaaaaa"
}
根据底层应用程序的设置方法,你或许可以翻转一位进而提升成为一名管理员。即使你的cookie是加密的。 如果你想再现我们的结果,我们的加密密钥是十六进制下的:000102030405060708090a0b0c0d0e0f