Web中的密码学

0x00 Something

这篇 web 中的密码学攻击滞留在博客好久了,因为详细写懒得动,简单写又太水,最后还是在这里水一下吧。包含:

  1. Hash扩展长度攻击
  2. Padding Oricle Attack
  3. Bit-flipping attack TO-DO

0x01 Hash扩展长度攻击

某篇wp中,为了填坑,写了关于此部分的理解。

MD5等hash算法会对输入进行分组并PADDING,来满足固定的长度,于是我们可以在原有的输入后手动增加PADDING字符,来保证原有的分组不被改变,并在原来的基础上添加新的输入。

PADDING:

  1. 消息必须进行补位,即使得其长度在对 512 取模后的值为 448。也就是说,len(message) % 512 = 448。当消息长度不满 448 bit 时(注意是位,而不是字符串长度),消息长度达到 448 bit 即可。当然,如果消息长度已经达到 448 bit,也要进行补位。补位是必须的。
  2. 补位的方式的二进制表示是在消息的后面加上一个1,后面跟着无限个0,直到 len(message) % 512 = 448。在 16 进制下,我们需要在消息后补80,就是 2 进制的10000000。我们把消息abc进行补位到 448 bit,也就是 56 byte。
  3. 补位过后,第 57 个字节储存的是补位之前的消息长度。abc是 3 个字母,也就是 3 个字节,24 bit。换算成 16 进制为 0x18。其后跟着 7 个字节的 0x00,把消息补满 64 字节。

我们以例子说明:
比如对’admin’字符串进行md5加密,那么填充就应该是
'61646d696e8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002800000000000000'
‘61646d696e’是admin的hex编码,80是填充的第一字节,后面的28表示40bit,即5个字节,是小端。

在采用MD5(SALT+SECRET)等类似方式时,由于未知量拼接后在SECRET前面,导致可以在SECRET后添加PADDING字符,在不知道salt的情况下,通过已知的一对VALUE-HASH值,枸造出一对新的VALUE-HASH值(value在原来的基础上在末尾添加额外数据)。

亦可参考:https://seaii-blog.com/index.php/2017/05/12/56.html

0x02 Padding Oricle Attack

原理请见:

  1. http://blog.zhaojie.me/2010/10/padding-oracle-attack-in-detail.html
  2. http://www.icylife.net/yunshu/attachments/Padding-Oracle-Attack.pdf

如果看原理的话,个人感觉最好的便是白帽子讲 web 安全,其次是上面两篇。其他的写的都没有上述的三篇清晰。

遇到的题目:
https://www.xmsec.cc/ddctf-2019-writeup/#%E5%86%8D%E6%9D%A5%E4%B8%80%E6%9D%AFjava

其中 token 在 cookie 中,值为 UGFkT3JhY2xlOml2L2NiY8O+7uQmXKFqNVUuI9c7VBe42FqRvernmQhsxyPnvxaF

显然提示了 Padding Oricle,根据原理可写出上文中的脚本,爆出明文 {"id":100,"roleAdmin":false},最后根据 IV / 中间值 / 密文的关系构造新的明文 {"id":100,"roleAdmin":true} 即可。

TODO

https://seaii-blog.com/index.php/2017/05/13/60.html

原来一直在看这篇,但是作者讲的细节也有一些欠缺,但是作为复习来看还是可以的。