打开网页,测试开始,注入费老大劲,看了大佬的blog才知道怎么干。
bp抓包,观察发现cookie中有个source=0,在repeater中修改为source=1,然go一下,出来了一段源代码。
$flag = "XXXXXXXXXXXXXXXXXXXXXXX";
$secret = "XXXXXXXXXXXXXXX"; // This secret is 15 characters long for security!
$username = $_POST["username"];
$password = $_POST["password"];
if (!empty($_COOKIE["getmein"])) {
if (urldecode($username) === "admin" && urldecode($password) != "admin") {
if ($COOKIE["getmein"] === md5($secret . urldecode($username . $password))) {
echo "Congratulations! You are a registered user.\n";
die ("The flag is ". $flag);
}
else {
die ("Your cookies don't match up! STOP HACKING THIS SITE.");
}
}
else {
die ("You are not an admin! LEAVE.");
}
}
setcookie("sample-hash", md5($secret . urldecode("admin" . "admin")), time() + (60 * 60 * 24 * 7));
if (empty($_COOKIE["source"])) {
setcookie("source", 0, time() + (60 * 60 * 24 * 7));
}
else {
if ($_COOKIE["source"] != 0) {
echo ""; // This source code is outputted here
}
}
意思就是username为admin,password不为admin,且$COOKIE["getmein"] === md5($secret . urldecode($username . $password))。
我们看下面的setcookie是md5($secret . urldecode("admin" . "admin")),意思是cookie是$secret连接上adminadmin的MD5加密,而还要求cookie为$secret连接上admin再连接上另一个不为admin的字符串的MD5加密。
这里我们能看到代码中的setcookie的值。
这里涉及到2个知识点和技巧。
1.加salt的加密
所谓加Salt,就是加点“佐料”。当用户首次提供密码时(通常是注册时),由系统自动往这个密码里加一些“Salt值”,这个值是由系统随机生成的,并且只有系统知道。然后再散列。而当用户登录时,系统为用户提供的代码撒上同样的“Salt值”,然后散列,再比较散列值,已确定密码是否正确。
这里的secert就很像一个未知的salt,对于这种未知salt,但过关MD5/sha1加密,目前有一个很好的办法,就是hash长度拓展攻击。
总之,加salt就是说,有你的密码+salt后再hash散列得到的值作为一个有保护性的密码,salt是随机生成的,
2.hash长度拓展攻击
该方法实现上面所说的$secret连接上adminadmin的MD5加密,而还要求cookie为$secret连接上admin再连接上另一个不为admin的字符串的MD5加密。
下面就开始hash长度拓展攻击
看大佬的blog上写得代码实现,下了一跳,本人水平太低,只会用工具。
下面直接使用:
signature为上面的setcookie的值。
因为secret长度为15,而且必须后面加上一个admin,所以长度为20.
Add那个是随便输的。
结果的第一行605cff28c1f7fbad37ef5f1dfd78028b,就是我们上面的代码中的cookie的getmein的值,
下面的admin\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\xc8\x00\x00\x00\x00\x00\x00\x00zzzz,需要将\x全部改为%,即admin%80%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%c8%00%00%00%00%00%00%00zzzz,就是我们应该传递的password的值。
然后我们修改抓的包就行了。
这样就拿到flag了。