Come risolvere problemi specifici XSS nell'URL via php?

2

Sto usando l'edizione della community di Netsparker per controllare la mia app per eventuali buchi di sicurezza generali. Sto ricevendo molte delle seguenti aree di problemi probabili XSS:

my_php_file.php?nsextt=" stYle=x:expre/**/ssion(alert(9)) ns="

Il codice in my_php_file.php non accetta alcun parametro $_GET o $_POST .

Quindi, come dovrei risolvere questo tipo di problemi XSS se non utilizzo nemmeno quei parametri $_GET o $_POST ?

Anche nelle pagine in cui utilizzo $_GET params ottengo questo:

my_php_file2.php?id=" stYle=x:expre/**/ssion(alert(9)) ns="

Faccio filtrare tutti i parametri in entrata (ad esempio id dall'ultimo snippet):

trim(htmlspecialchars($_GET['id']));

E dopo tutto, ho persino eseguito il risultato del precedente in preg per consentire solo le cifre del parametro id.

Qualcuno potrebbe essere così gentile e mi consiglierà di cosa sono questi avvisi XSS? Come affrontarli?

    
posta arma 11.05.2012 - 08:06
fonte

3 risposte

5

Ti suggerisco di leggere sulla difesa contro XSS. OWASP ha buone risorse. È necessario applicare la convalida dell'input corretta a tutti i valori di input e scappare correttamente tutti i valori dinamici che si inseriscono nel documento HTML di output. Ci sono molte risorse online su come prevenire XSS.

Per quanto riguarda la tua specifica applicazione, non ci hai fornito abbastanza informazioni per diagnosticare il problema. Hai provato ad aprire my_php_file.php?nsextt="..." nel tuo browser, per vedere cosa succede? Viene visualizzata una finestra di avviso? Se visualizzi l'origine della risposta, vedi un attributo " style=... " in qualsiasi punto della risposta? Inoltre, anche se dici di non utilizzare alcun parametro GET in my_php_file.php, è possibile che il codice in my_php_file.php includa un altro file PHP o possa chiamare qualche altra funzione che produce output non sicuri? Sospetto che tu possa avere una vulnerabilità XSS che consente l'inserimento di un nuovo attributo nel mezzo di qualche elenco di attributi da qualche parte.

Hai menzionato l'approccio che stai utilizzando per disinfettare i parametri su altre pagine. Vorrei dire che questo non è il metodo di sanitizzazione dell'input corretto. strip_tags non impedisce XSS ( strip_tags non è garantito per rimuovere tutti i tag e anche se lo ha fatto, rimuovere tutti i tag non è sufficiente, in quanto si può ancora montare un attacco XSS iniettando attributi senza iniettare nuovi tag). Una buona regola è che se stai usando strip_tags , probabilmente stai facendo qualcosa di sbagliato.

Più in generale, la convalida dell'input non riguarda il buttare ciecamente ogni funzione di stripping che è possibile pensare ai dati. Invece, dovresti controllare che l'input corrisponda a una lista bianca o regexp appropriata, a seconda del tipo di dati. E, quando si generano i dati, si dovrebbe scappare in un modo adatto al contesto in cui verranno inseriti i dati. Ad esempio, se lo inserisci nel contesto HTML standard tra tag, puoi sfuggire ai dati con htmlescapechars . Se lo stai inserendo come link (come valore di un attributo href), devi assicurarti che sia un URL formattato correttamente con uno schema sicuro (http o https sono sicuri, javascript non lo è). C'è ancora molto da dire sulla convalida dell'input e sull'output dell'output: guarda le risorse OWASP per un sacco di ottime informazioni su questo argomento.

    
risposta data 11.05.2012 - 08:40
fonte
5

Per la tua prima domanda, se sei sicuro che il tuo codice non usi $ _GET o $ _POST, allora dovresti stare bene. Ma stai usando un framework o qualche altro codice? Hai provato ad accedere a my_php_file.php?nsextt=hello%20world e cercare "ciao mondo" nella fonte? Forse dimentichi che alcuni includono $ _GET ['nsextt']?

(nota: passando var tramite l'url in un browser, verrà utilizzato solo $ _GET.)

Ora, per la seconda parte, invece di tutte quelle funzioni + preg per verificare se l'input è un int, dovresti usare filter_var() funzioni in php:

$secure_integer = filter_var($_GET['id'], FILTER_SANITIZE_NUMBER_INT);

Se lo desideri, puoi anche solo convalidare l'input con FILTER_VALIDATE_INT anziché FILTER_SANITIZE_NUMBER_INT .

    
risposta data 11.05.2012 - 09:20
fonte
0

utilizza questa libreria per proteggerti dagli attacchi XSS codice PHP antixss e anche loro sono funzioni PHP chiamate htmlspecialchars () che ti aiuterà molto e dovresti saperlo, puoi usare foglio cheat di prevenzione OWASP XSS come guida anche

    
risposta data 12.05.2012 - 14:48
fonte

Leggi altre domande sui tag