Perché è pericoloso consentire tutti i caratteri in un URL?

4

Rivedendo la configurazione di CodeIgniter, ho visto la seguente riga:

$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';

E la documentazione dice:

/*
|--------------------------------------------------------------------------
| Allowed URL Characters
|--------------------------------------------------------------------------
|
| This lets you specify which characters are permitted within your URLs.
| When someone tries to submit a URL with disallowed characters they will
| get a warning message.
|
| As a security measure you are STRONGLY encouraged to restrict URLs to
| as few characters as possible.  By default only these are allowed: a-z 0-9~%.:_-
|
| Leave blank to allow all characters -- but only if you are insane.
|
| The configured value is actually a regular expression character group
| and it will be executed as: ! preg_match('/^[<permitted_uri_chars>]+$/i
|
| DO NOT CHANGE THIS UNLESS YOU FULLY UNDERSTAND THE REPERCUSSIONS!!
|
*/

Tuttavia non ero del tutto chiaro, che possano esistere effetti o problemi di sicurezza per consentire a tutti i caratteri in un URL.

Quali problemi possono generare questa situazione?

    
posta Juan Pinzón 10.08.2016 - 18:56
fonte

2 risposte

3

Limitare il set di caratteri in questo modo (anche chiamato whitelisting) è uno dei metodi raccomandati di validazione dell'input . Lo scopo della convalida dell'input è impedire che un programma esegua dati che potrebbero causare problemi non previsti.

Ci sono molti attacchi riusciti che sono il risultato di URL malformati (questi non sono veri URL di attacco, ma rappresentativi di attacchi):

  • injection pathpath: http://example.com/?C:\documents\top_secrets.txt
  • overflow del buffer: http://example.com/aaaaaaaaaaaaaaaaaaaaaaaaa...aaaEvilShellCode
  • script injection: http://example.com/?<script>alert("Click me!")</script>
  • Iniezione SQL: http://example.com/?USER=' or 1=1; select * from users

Le prime reazioni a questi attacchi consistevano nel proibire il carattere barra rovesciata, le virgolette, gli asterischi e i simboli minore o maggiore di. Questo è chiamato blacklisting; sfortunatamente, la lista nera è per lo più un approccio "patch dopo aver imparato circa l'attacco". La whitelisting è un po 'più efficace della blacklist. Tuttavia, la limitazione dei caratteri visualizzati in un URL può fare praticamente nulla per prevenire molti di questi attacchi se possono essere bypassati utilizzando percentuale codifica , che consente all'utente malintenzionato di utilizzare solo caratteri dalla lista bianca approvata:% 2F è uguale a /, ecc.

Per essere efficace, la regexp in CodeIgniter deve essere eseguita dopo la decodifica della codifica percentuale. E per evitare problemi di overflow del buffer mentre si testano semplicemente i dati con regexp, il primo passo del validatore deve essere il controllo della lunghezza.

C'è un altro problema che potrebbero tentare di impedire con la loro lista bianca, e cioè dirottamento di URL utilizzando Caratteri Unicode per simulare i caratteri ASCII . Per un essere umano che fa semplicemente clic su un collegamento, le stringhe "exampleZurichBank.com" e "exampleZuricⱨBank.com appaiono simili.Il blocco dei caratteri Unicode che non si trovano nell'intervallo [AZ] [az] aiuta a prevenirli, ma disenflama anche un grande segmento del pianeta bloccando gli URL nei loro alfabeti nativi.

Tieni presente che la convalida dell'input è solo una misura preventiva di molti che devono ancora essere implementati. Le applicazioni devono ancora difendersi da altre vulnerabilità comuni, come XSS, CSRF, SQL injection, session hijacking, ecc.

    
risposta data 11.08.2016 - 17:22
fonte
1

Se postuli che tutto il codice in esecuzione sul tuo server analizzi correttamente gli URL e li codifichi quando esegui ricerche di file system, quando li includi nelle query del database, quando li passi ai comandi della shell e così via, e che il codice sia completamente coerente per quanto riguarda quando considera le stringhe uguali (es. codifica percentuale per URL, distinzione tra maiuscole e minuscole, codifiche non ASCII, normalizzazione Unicode, ...), non c'è alcun danno nel consentire qualsiasi carattere negli URL.

Ma quanto sei sicuro che tutto il codice che stai utilizzando sia perfettamente sicuro e coerente?

Ridurre il set di caratteri consentiti riduce il potenziale di vulnerabilità. Ad esempio, se hai codice che costruisce query SQL inserendo direttamente parti dell'URL come sprintf("select where name = '%s'", url.param[1]) , ma gli URL non possono contenere '%27 , allora questa vulnerabilità di SQL injection non può essere effettivamente sfruttata.

    
risposta data 11.08.2016 - 02:30
fonte

Leggi altre domande sui tag