Mi sono imbattuto in una sfida per ctf in cui il caricamento di file php
è stato limitato ma phpp
e phP
non lo erano. In quali altri formati è possibile caricare php e qual è la differenza?
Bene, ho anche notato questo comportamento. Come @schroeder menzionato nei commenti all'inizio, pensavo anche che avesse a che fare con la funzione di upload ma poi ho deciso di provare alcuni test. Quindi per esempio se abbiamo un file php chiamato test.php e contiene il seguente codice:
<?php echo shell_exec('whoami'); ?>
Se proviamo ad eseguirlo con php test.php
( supponendo che php sia installato ), verrà eseguito con successo. Ora il
la parte strana è che se cambiamo l'estensione funziona ancora. Ecco un POC che modifica automaticamente l'estensione
e prova ad eseguire il file:
#!/bin/bash
# file with some possible extensions...
declare -a extensions=("test.phP" "test.PHp" "test.asdfphp" "test" "test.txt")
tmp='test.php'
for ext in "${extensions[@]}";do
echo -e "Renaming file to $ext and try to execute it..."
mv $tmp $ext; php $ext
tmp=$ext
done
Quindi tutte quelle estensioni di file sono eseguite correttamente. I risultati dello script sopra sono:
Renaming file to test.phP and try to execute it...
username
Renaming file to test.PHp and try to execute it...
username
Renaming file to test.asdfphp and try to execute it...
username
Renaming file to test and try to execute it...
username
Renaming file to test.txt and try to execute it...
username
Ora anche se rimuoviamo la parola chiave php
dal tag <?php
in test.php
file, o anche rimuoviamo
l'ultimo tag di chiusura ?>
lo script è ancora valido codice php (come @AndrolGenhald ha puntualizzato correttamente nei commenti a causa di Tag brevi PHP ) e verranno comunque eseguiti correttamente. Quindi suppongo che php controlli il file e se è un contenuto php valido
sarà eseguito. Anche se ho cercato e non ho trovato la mia ipotesi documentata, quindi se qualcuno sa che l'assunzione di cui sopra è effettivamente corretta, per favore pubblica un link:)
Come una solita sfida CTF, l'idea è che qualcuno abbia creato qualcosa, ma c'è una vulnerabilità in esso. Il tuo obiettivo è ottenere il flag e, dato che puoi caricare un file, probabilmente devi eseguire il codice sul server (in modo che possa elencare i file nella directory e leggere il file flag).
Se puoi caricare <?php echo 'ls';
in example.php
sul server, il server probabilmente eseguirà il file quando apri l'URL. Apparentemente, qualcuno ha cercato di impedire agli utenti di caricare file con l'estensione .php
. Ma come hai notato, un file che termina con .phP
va bene. Il programmatore probabilmente ha fatto qualcosa del genere:
if (substr_count($filename, ".php") != 0){ reject upload; }
Quindi non puoi caricare .php
file ... ma al server web non interessa se si chiama .php
o .PHP
o .phP
: la sua configurazione dice solo che qualcosa che termina in .php
(maiuscole e minuscole) dovrebbe essere eseguito come se fosse un codice PHP. L'estensione è solo una parte del nome del file, quindi i contenuti sono sempre gli stessi, solo il nome è diverso. Se ne hai voglia, puoi inserire il codice PHP in un file chiamato example.aayush
e configurare Apache o Nginx per eseguire .aayush
file come codice PHP. E poiché sono tipicamente insensibili alle maiuscole e minuscole, puoi anche eseguire .Aayush
file allo stesso modo.
Spero che questo aiuti a risolvere la sfida!
Oppure, se vuoi sapere come risolvere questa vulnerabilità, vedi le domande taggate: file-upload .
What other formats can PHP be uploaded in?
Supponendo che si intenda l'estensione del file e non il formato, qualsiasi estensione di file che sia consentita dal codice di caricamento e identificata come script PHP dalla configurazione del server PHP (Apache httpd's PHP module o PHP-FPM) può essere eseguibile. Ad esempio, se il server è configurato per eseguire *.php*
file, i file che terminano in .php
, .php7
e normalmente quelli non validi come .phpp
possono essere eseguiti.
Leggi altre domande sui tag ctf file-upload file-types