2010-07-27 7 views
17

Qualcuno (probabilmente un bot) ha inviato una richiesta con il seguente URL per la mia ASP.NET 4.0 applicazione web form (in esecuzione su IIS 7.0):Perché si sta utilizzando un URL contenente un colon considerato come "richiesta potenzialmente pericolosa"?

http://ipaddress-of-my-applications-domain/bla1.bla2.bla3.bla4.bla5:)

Questo ha causato un System.Web.HttpException. Ho ricevuto una e-mail di registrazione da ASP.NET healthMonitoring avevo configurato, dicendomi:

Un valore Request.Path potenzialmente pericoloso è stato rilevato dal client (:).

traccia stack è stato:

System.Web.HttpRequest.ValidateInputIfRequiredByConfig() 
System.Web.HttpApplication.PipelineStepManager.ValidateHelper(HttpContext context) 

Perché è un colon nell'URL "potenzialmente pericolosi"? Quali cose pericolose possono essere fatte con un tale URL? Ho qualche buco di sicurezza qui di cui non sono a conoscenza?

Grazie per la spiegazione in anticipo!

Modifica

Ho provato che i due punti in una stringa di query (come http://mydomain.com?Test=9:)) non provoca questa eccezione.

+0

Vedi questa domanda - http://stackoverflow.com/questions/2053132/is-a-colon-safe-for-friendly-url-use - Non penso che sia un duplicato in quanto tale ma discute dei due URL – ChrisF

+0

Questa pagina su [Encoding URL] (http://www.blooberry.com/indexdot/html/topics/urlencoding.htm) elenca i due punti nella sua tabella di caratteri riservati ma non spiega a cosa serve. – ChrisF

+0

Grazie per il link! Ma questa domanda sembra più discutere se un colon è "sicuro" rispetto alla codifica URL. L'eccezione ASP.NET mi sembrava più che potesse esserci una minaccia alla sicurezza. – Slauma

risposta

19

Su NTFS, un dato filepath può avere più flussi di dati associati. Oltre al flusso principale, noto anche come $DATA, ce ne possono essere altri, in genere utilizzati per memorizzare metadati come il marcatore della zona Internet nei file scaricati.

Alternate Data Streams si accede utilizzando un separatore di due punti, ad es. file.dat:$DATA è un modo alternativo per dire file.dat. La presenza di ADS attraverso il Web ha causato alcuni problemi di sicurezza in passato in Microsoft (ad esempio, restituendo il codice sorgente delle pagine ASP invece di eseguirli), quindi per precauzione stanno bloccando l'uso dei due punti nel percorso parte del URL, poiché la parte del percorso viene spesso mappata al filesystem (sebbene non nel tuo caso). È meno probabile che si verifichi dalla stringa di query, quindi non è bloccato lì.

Questo è lontano dal peggiore falso positivo che la convalida della richiesta genererà. Le sue caratteristiche anti-iniezione sono molto peggiori. Personalmente lo disabiliterei sempre, in quanto è una stupida funzionalità che non può mai rendere sicura la tua webapp; solo la giusta attenzione alla fuga delle stringhe (e alla pesante sanificazione di tutto ciò che si intende utilizzare come nome file) può farlo.

Ci sono altri caratteri che anche se si disattiva la convalida della richiesta non è possibile inserire una parte di percorso per scopi di routing. In particolare, le barre (%2F, %5C e le sequenze di byte che non sarebbero valide per le lunghe sequenze UTF-8 che si risolvono con lo stesso) e il byte zero. È meglio essere prudenti su ciò che metti in percorsi in generale.

+2

questo era un vuln effettivo su NT4, ad es. http://www.securityfocus.com/bid/149/discuss – devio

+0

Grazie, ottima spiegazione! Quindi questo controllo di sicurezza e rischio con i due punti è una cosa specifica per MS-Windows. Una nota alla tua raccomandazione di disattivare la convalida della richiesta ASP.NET: l'ho eseguita pagina per pagina (per molte pagine nell'app) e faccio i controlli e la codifica appropriati a mano. Ma ad essere onesti: la tua risposta mi ha convinto a non smetterla mai globalmente perché il rischio per la sicurezza che descrivi mi sembra abbastanza complesso e non ne ho mai sentito parlare prima. Quali altri pericoli potrebbe anche verificare la convalida della richiesta integrata? Se lo spengo, dovrei conoscere tutti questi rischi e fornire le mie misure. – Slauma

+3

Se si utilizza il valore 'bla1.bla2.bla3.bla4.bla5:)' solo come parametro di instradamento e mai come nome di file effettivo, non c'è vulnerabilità. Disinfettare l'input dell'utente per utilizzarlo come un nome file su Windows è un compito difficile, molto più complicato rispetto a questo problema. Evitare di utilizzare il contenuto fornito dall'utente per i nomi di file in generale. Non fidarsi della convalida della richiesta per qualcosa, non e non può proteggerti dalle vulnerabilità nel caso generale e * bloccherà * input perfettamente validi. – bobince

0

Ciò è dovuto alla funzionalità di convalida della richiesta di ASP.NET, che impedisce ai client di attaccare il tuo sito web. La funzione è abilitata per impostazione predefinita.

Il seguente link spiega meglio: http://www.asp.net/learn/whitepapers/request-validation

+0

Perché i due punti in un URL sono un "attacco di iniezione"? Conosco la funzione di convalida della richiesta, ma finora solo nel contesto dell'invio di valori di modulo che contengono tag