遇到一个不一样的hash拓展攻击
flag在管理员手里
页面提示Only Admin can see the flag!!
抓包看到cookie
Cookie: role=s%3A5%3A%22guest%22%3B; hsh=3a4727d57463f122833d9e732f94e4e0
role的值进行urldecode后是s:5:"guest";
guest改成admin果然也没用,再看hsh,见过这种类型的就是hash拓展攻击了
但没有源码,找一下源码泄漏
常用方法: ctf/web源码泄露及利用办法
不过这题在index.php~里,得用vim -r恢复,不然很难看
1 | <!DOCTYPE html> |
需要满足
$role==="admin" && $hsh === md5($salt.strrev($_COOKIE["role"]))
因为strrev会反转字符串,hashpump添加的内容为逆序较好,便于后期替换
1 | >>> print('s:5:"guest";'[::-1]) |
到这里还缺少一个至关重要的因素就是salt的长度
这也是和之前见过的hash拓展攻击题目不同的一点
无奈看一些WP用的开源工具hash_extender,但我看不太懂,脚本也折腾不起来
我的想法是
反正只要爆破下长度就行,用hashpump能得到新的role和hsh
得到的新hsh的值是不变的,不同的长度role的值不同
hashpump用法如下:
hashpump --signature 3a4727d57463f122833d9e732f94e4e0 --data ';"tseug":5:s' --additional ';"nimda":5:s' --keylength 12
整个简单的shell,输出10-30长度的role
1 | #!/bin/bash |
./hashpump.sh > role.txt
输出到文本
进行简单的文本处理后,上脚本挨个试一试
也能得到flag,salt长度12
不过,由于url解码,role中个别字符要调整
原理
加密过程
MD5加密过程中512比特(64字节)为一组,属于分组加密,而且在运算的过程中,将512比特分为32bit*16块,分块运算
关键利用的是MD5的填充,对加密的字符串进行填充(比特第一位为1其余比特为0),使之(二进制)补到448模512同余,即长度为512的倍数减64,最后的64位在补充为原来字符串的长度,这样刚好补满512位的倍数,如果当前明文正好是512bit倍数则再加上一个512bit的一组。
MD5不管怎么加密,每一块加密得到的密文作为下一次加密的初始向量。
加密流程图
选一个字符串例如“Acker”MD5(“Acker”)= dee2fb2df156f4040f893d8a10ac1034
现在我们不需要知道字符串是什么。只需要知道其长度,并将字符串填充完,新加一个字符串如:addition,之前得到的“Acker”MD5值作为最后一块加密的初始向量,最后得到的结果和MD5(“Acker+addition”)是一样的。