Niveau 23

Natas 23

Level Goal

Username: natas23
Password: D0vlad33nQF0Hz2EP255TP5wSW9ZsRSE
URL: http://natas23.natas.labs.overthewire.org

En se connectant à la page du challenge 23 (curl http://natas23.natas.labs.overthewire.org -u natas23:D0vlad33nQF0Hz2EP255TP5wSW9ZsRSE) on accède à un formulaire qui permet de rentrer un mot de passe :

Password:
<form name="input" method="get">
    <input type="text" name="passwd" size=20>
    <input type="submit" value="Login">
</form>

Ainsi que le code source permettant d'afficher le mot de passe :

<?php
    if(array_key_exists("passwd",$_REQUEST)){
        if(strstr($_REQUEST["passwd"],"iloveyou") && ($_REQUEST["passwd"] > 10 )){
            echo "<br>The credentials for the next level are:<br>";
            echo "<pre>Username: natas24 Password: <censored></pre>";
        }
        else{
            echo "<br>Wrong!<br>";
        }
    }
    // morla / 10111
?>  

Comme on peut le voir, deux conditions doivent être valide pour afficher le mot de passe de la prochaine épreuve :

Si le premier point est relativement facile à valider, pour le second il faut avoir conscience du fait que PHP fait du typage dynamique et permet de comparer des variables de type différent.

En fonction de la version de PHP le résultat pourra différer, mais une règle facile est de se dire que tous les caractères qui ne sont pas des chiffres ne sont pas pris en compte pour la comparaison d'une variable texte avec un chiffre.

Par ailleurs, lors de ce type de conversion automatique PHP peut arrêter la conversion dès qu'il rencontre autre chose qu'une chiffre. Ainsi 1a9 pourra être vu comme 1 et non 19.

Ainsi si on effectue la requête curl suivante :

curl --form passwd='11iloveyou' \
     http://natas23.natas.labs.overthewire.org -u natas23:D0vlad33nQF0Hz2EP255TP5wSW9ZsRSE

On obtient la réponse :

The credentials for the next level are:
Username: natas24
Password: OsRmXFguozKpTZZ5X14zNO43379LZveg