知识点
hash长度扩展攻击
深入理解hash长度扩展攻击(sha1为例)
0x01
扫描后台目录,发现index.php~,下载后打开,发现是乱码,文件头部是vim版本号。这其实是index.php的备份恢复文件,修改文件名为.index.php.swp
,输入命令vim -r index.php
得到恢复后的index.php。
源码如下:
<!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>
0x02
解题步骤:
- 访问网页,得到cookie中的role和hsh这里的hsh是
$slat
+;"tseug":5:s
经过md5加密后的值; - 设置cookie中role的值,满足以下两个条件:
$role==="admin" && $hsh === md5($salt.strrev($_COOKIE["role"]))
第一个条件$role==="admin"
只需要使$role
参数的前5个字符是"admin"
,第六个字符是'\0'
即可。
第二个条件$hsh === md5($salt.strrev($_COOKIE["role"]))
,注意和$salt
连接的字符串是经过strrev函数处理的role参数,只需要构造role参数的后半部分,通过hash长度扩展攻击,经过运算得到新的hsh即可。$salt
的长度暂时不知道,暂时输入一个数字10,得到新的hash值fcdc3840332555511c4e4323f6decb07
以及一个接近payload的字符串;"tseug":5:s\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0\x00\x00\x00\x00\x00\x00\x00;"nimda":5:s
。\xb0
说明$salt
+;"tseug":5:s
一共176bit,也就是22字节,$salt
长假设是10字节。
安装hashpump:
git clone https://github.com/bwall/HashPump
apt-get install g++ libssl-dev
cd HashPump
make
make install
0x03
;"tseug":5:s\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc0\x00\x00\x00\x00\x00\x00\x00;"nimda":5:s
将上述字符串中的\x
替换成%
,;
替换成%3b
,倒序排列,得到:
s:5:"admin"%3b%00%00%00%00%00%00%00%c0%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%80s:5:"guest"%3b
使用burpsuite爆破salt的长度,得到flag:
PS
只有salt在前,value在后,才可以用hash长度扩展攻击。