Test dell'iniezione di moduli PHP

7

Sto scrivendo una piccola app per PHP che accetta l'input tramite un modulo. Come prevedibile per una prima revisione, il codice non esegue l'escape o la sanificazione dell'input:

if( $_POST["var"] != "" ) {
    print "Current value: ".$_POST["var"]."\n";
}

Ma se provo a iniettare codice PHP ( "; print phpinfo(); , "ecc.), mi viene solo restituito un eco anziché eseguirlo.

Sono a conoscenza di come pulire l'input usando htmlspecialchars , addcslashes , mysqli_real_escape_string ecc. ma prima di usarli - quale sintassi ho bisogno per iniettare codice PHP arbitrario?

Ho notato che la mia macchina ha installato la patch per Suhosin PHP (Ubuntu 10.10) - mi piacerebbe che sfuggissi / disinfettasse automaticamente il mio input per me?

    
posta Andrew 17.02.2011 - 01:48
fonte

3 risposte

9

Per quel codice, non mi aspetterei di ottenere l'iniezione PHP, ma guarderei invece Cross-Site Scripting (XSS).

Ad esempio, prova ad iniettare:

<script> alert('woot Security.SE rulez!');</script>
    
risposta data 17.02.2011 - 01:58
fonte
4

"Iniezione PHP" non è possibile a meno che la tua applicazione non utilizzi include (), require (), eval (), create_function () o una qualsiasi di quelle funzioni simili che invocano l'interprete. Oppure se la tua applicazione scrive su file nel percorso di PHP che terminano con .php, .phtml o qualsiasi altra estensione di file registrata da PHP.

Come sottolineato da AviD, tuttavia, markup e script injection sono sicuramente possibili nel tuo esempio.

Prova a scaricare "Tamper Data" ... è un componente aggiuntivo per Firefox che rende estremamente facile eseguire attacchi di iniezione contro un'applicazione web. Ha anche alcuni attacchi predefiniti incorporati che puoi provare, nel caso non te ne accorgessi!

    
risposta data 09.03.2011 - 00:10
fonte
2

Solo FYI non prenderei in considerazione l'utilizzo di stripcslashes in quanto potrebbe anche causare XSS.

Lasciami spiegare: stripeslashes vs stripcslashes

stripslash rimuove tutti i backslash indipendentemente dal tipo

stripcslashes rimuoverà tutte le barre inverse tranne i caratteri esadecimali, quindi ciò significa che è possibile eseguire un attacco XSS su una funzione che usa stripcslashes facendo qualcosa del genere:

\x3c\x73\x63\x72\x69\x70\x74\x3e\x61\x6c\x65\x72\x74\x28\x27\x58\x53\x53\x21\x27\x29\x3b\x3c\x2f\x73\x63\x72\x69\x70\x74\x3e

Che quando valutato dalla funzione stripcslashes risulterà in: alert ('XSS!');

Questa era in realtà una vulnerabilità che ho trovato all'interno di un famoso plugin Wordpress (Platinum SEO < = 1.3.7)

Assicurati di fare le tue ricerche sulle funzioni che stai utilizzando prima di utilizzarle poiché potresti causare più problemi di quanti ne valga.

Questo vale anche per il tuo utilizzo di addcslashes () perché potresti costringerlo a valutare il codice dove non vuoi, in questo modo:

$>php -r 'echo addcslashes("\x41", "A..z");' 
\A   

Ed ecco un esempio di base in uso per una stringa XSS non valida:

> php -r 'echo addcslashes("\x3c\x73\x63\x72\x69\x70\x74\x3e\x61\x6c\x65\x72\x74\x28\x27\x58\x53\x53\x21\x27\x29\x3b\x3c\x2f\x73\x63\x72\x69\x70\x74\x3e", "/");'   
<script>alert('XSS!');<\/script>

Come puoi vedere, eseguiresti comunque l'avviso.

Come confermato da mehaase, non c'è modo di invocare codice PHP senza usare qualcosa come include (), require (), eval (), system () (Hai più problemi se stai usando system () su input dell'utente rispetto all'esecuzione di codice arbitrario PHP.

    
risposta data 25.09.2013 - 13:19
fonte

Leggi altre domande sui tag