Natas 22
Level Goal
Username: natas22
Password: chG9fbe1Tq2eWVMgjYYD1MsfIvN461kJ
URL: http://natas22.natas.labs.overthewire.org
En se connectant à la page du challenge 22 (curl http://natas22.natas.labs.overthewire.org -u natas22:chG9fbe1Tq2eWVMgjYYD1MsfIvN461kJ
) on accède à une page vide. Si l'on regarde le code source associé, on peut voir deux blocs de PHP différents :
<?
session_start();
if(array_key_exists("revelio", $_GET)) {
// only admins can reveal the password
if(!($_SESSION and array_key_exists("admin", $_SESSION) and $_SESSION["admin"] == 1)) {
header("Location: /");
}
}
?>
Puis :
<?
if(array_key_exists("revelio", $_GET)) {
print "You are an admin. The credentials for the next level are:<br>";
print "<pre>Username: natas23\n";
print "Password: <censored></pre>";
}
?>
Le fonctionnement de la page est le suivant ; si on rajoute le paramètre revelio
à l'url, deux choses doivent se produire :
- si le visiteur n'a pas de de session utilisateur avec le paramètre
admin
avec une valeur de1
, alors il est redirigé à la racine du site via - puis, si il n'a pas été redirigé avant, le mot de passe pour le prochain niveau va s'afficher
De fait il est à priori impossible d'avoir accès au mot de passe : il faut indiquer le paramètre revelio
pour pouvoir l'afficher, mais cela revient à être redirigé vers la racine du site avant qu'il soit affiché.
Pourtant, la redirection mise en place via un header est simplement une indication renvoyée aux navigateurs des visiteurs pour les rediriger mais peut ne pas être suivi.
D'ailleurs curl ne suit pas les redirections par défaut ce qui signifie qu'une simple requête avec le paramètre revelio
dans l'url peut nous permettre de trouver le mot de passe :
curl http://natas22.natas.labs.overthewire.org/?revelio -u natas22:chG9fbe1Tq2eWVMgjYYD1MsfIvN461kJ
On obtient la réponse suivante :
You are an admin. The credentials for the next level are:
Username: natas23
Password: D0vlad33nQF0Hz2EP255TP5wSW9ZsRSE