Iniezione comando quando tutti i personaggi pericolosi sono sfuggiti?

1

OWASP raccomanda come difesa contro l'iniezione del comando per sfuggire a tutti i caratteri speciali (se non è possibile utilizzare un approccio di lista bianca).

Ho scritto un rapido script PHP facendo questo:

$input = $_GET['x'];
$dangerous = array("{", "}", "", "(", ")", "<", ">", "&", "*", "|", "=", "?", ";", "[", "]", "$", "–", "~", "!", ".", "%", "/", ":", "+", "'");

$input = str_replace("\","\\",$input);
foreach ($dangerous as $char) {
    $input = str_replace($char,"\$char",$input);
}

echo  passthru("echo '$input'");
echo "<br><br>executed: " . $input ;

Tuttavia, se utilizzo ' come input, causerà un errore ( Unterminated quoted string ).

Non ero in grado di aggirare l'escape di questi caratteri, ma non sembra ideale che un utente malintenzionato possa generare un errore bash a causa di una sintassi non valida.

C'è un modo per aggirare l'evasione di questi caratteri speciali?

So che si consiglia di utilizzare una whitelist o meccanismi esistenti come escapeshellcmd. Sono più interessato all'idea generale di aggirare l'escape di caratteri speciali.

    
posta tim 13.12.2018 - 12:38
fonte

1 risposta

2

Mi sono inventato un bypass.

Come menzionato da @Sjoerd, gli escape di backslash non funzionano nelle stringhe con quotatura singola, quindi è possibile uscire dalla singola stringa tra virgolette.

L'elenco dei caratteri "pericolosi" non include i backtick o gli hash; che consente a un payload come questo di funzionare:

' 'hostname' #

O urlencoded:

%27%20%60hostname%60%20%23

La virgoletta diventa \' (che viene trattata come una citazione regolare e '\' diventa il primo argomento a echo ), il comando nei backtick viene eseguito con l'output del comando passato a echo . L'hash è trattato come un commento e fa sì che la shell ignori la virgoletta finale finale, evitando un errore di sintassi.

    
risposta data 13.12.2018 - 14:29
fonte

Leggi altre domande sui tag