Hash拓展攻击(hash length extension attacks)

遇到一个不一样的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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<!DOCTYPE html>
<html>
<head>
<title>Web 350</title>
<style type="text/css">
body {
background:gray;
text-align:center;
}
</style>
</head>

<body>
<?php
$auth = false;
$role = "guest";
$salt =
if (isset($_COOKIE["role"])) {
$role = unserialize($_COOKIE["role"]);
$hsh = $_COOKIE["hsh"];
if ($role==="admin" && $hsh === md5($salt.strrev($_COOKIE["role"]))) {
$auth = true;
} else {
$auth = false;
}
} else {
$s = serialize($role);
setcookie('role',$s);
$hsh = md5($salt.strrev($s));
setcookie('hsh',$hsh);
}
if ($auth) {
echo "<h3>Welcome Admin. Your flag is
} else {
echo "<h3>Only Admin can see the flag!!</h3>";
}
?>

</body>
</html>

需要满足

$role==="admin" && $hsh === md5($salt.strrev($_COOKIE["role"]))

因为strrev会反转字符串,hashpump添加的内容为逆序较好,便于后期替换

1
2
3
4
>>> print('s:5:"guest";'[::-1])
;"tseug":5:s
同样,有
;"nimda":5:s

到这里还缺少一个至关重要的因素就是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
2
3
4
5
#!/bin/bash
for ((i=10;i<=30;i++))
do
hashpump --signature 3a4727d57463f122833d9e732f94e4e0 --data ';"tseug":5:s' --additional ';"nimda":5:s' --keylength $i
done

./hashpump.sh > role.txt输出到文本

进行简单的文本处理后,上脚本挨个试一试

也能得到flag,salt长度12

不过,由于url解码,role中个别字符要调整

2.png

原理

5.jpg

加密过程

MD5加密过程中512比特(64字节)为一组,属于分组加密,而且在运算的过程中,将512比特分为32bit*16块,分块运算

关键利用的是MD5的填充,对加密的字符串进行填充(比特第一位为1其余比特为0),使之(二进制)补到448模512同余,即长度为512的倍数减64,最后的64位在补充为原来字符串的长度,这样刚好补满512位的倍数,如果当前明文正好是512bit倍数则再加上一个512bit的一组。

MD5不管怎么加密,每一块加密得到的密文作为下一次加密的初始向量。

加密流程图

6.png

选一个字符串例如“Acker”MD5(“Acker”)= dee2fb2df156f4040f893d8a10ac1034

现在我们不需要知道字符串是什么。只需要知道其长度,并将字符串填充完,新加一个字符串如:addition,之前得到的“Acker”MD5值作为最后一块加密的初始向量,最后得到的结果和MD5(“Acker+addition”)是一样的。

参考:Hash拓展长度攻击原理剖析

文章作者: J0k3r
文章链接: http://j0k3r.top/2018/06/16/k15_hash/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 J0k3r's Blog