Canonicalizzazione e codifica dell'output

8

Sto leggendo la Checklist di Secure Coding Practice di OWASP e nella sezione "Input Validation" hanno una voce che dice:

If any potentially hazardous characters (<>"'%()&+\'\") must be allowed as input, be sure you implement additional controls like output encoding. Utilize canonicalization to address double encoding or other forms of obfuscation attacks.

  • Che cos'è la "codifica dell'output" e qualcuno può fornire un esempio concreto di come una routine di validazione potrebbe farne uso?
  • Che cos'è la "doppia codifica" e perché è un "attacco di offuscamento"?
  • Che cos'è la "canonicalizzazione" e perché impedisce la doppia codifica?

Per il terzo, ho trovato una definizione piuttosto vaga per canonicalization fornita da OWASP: La riduzione di varie codifiche di dati in un unico, semplice modulo. Ma quella definizione in realtà non mi aiuta a dare un senso a ciò di cui stanno parlando.

Sono strong con Java e Python ma potrei seguire un esempio in qualsiasi lingua. Sto solo cercando di visualizzare ciò di cui stanno parlando e sto attraversando un periodo difficile vedendo la "foresta tra gli alberi". Grazie in anticipo!

    
posta zharvey 09.08.2012 - 03:40
fonte

2 risposte

3

Penso che il modo migliore per descrivere la canonicalizzazione sia ricordare che deriva da canon , che significa un autentico pezzo di scrittura. Ciò di cui stanno parlando è l'acquisizione di dati non attendibili e la loro formattazione come rappresentazione non ambigua, tale da non poter mai essere travisata da alcun processo software.

Il primo passo è prendere il tuo contributo e memorizzarlo da qualche parte. Il tuo input potrebbe essere codificato come ASCII, UTF-8, UTF-16 o qualsiasi altro numero di schemi di codifica. Il software deve rilevarlo e convertire e archiviare in modo appropriato i dati in un unico formato. Ora è in un unico formato non ambiguo, e quindi è noto per essere corretto quando interpretato come tale, cioè è canon . Ciò consente la certezza assoluta quando si emettono i dati successivamente.

Ad esempio, se inserisco '; DROP TABLE users; -- in un modulo, potrebbe causare un'iniezione SQL se l'app è scritta male. Tuttavia, con la canonicalizzazione, i dati sono solo dati e non possono essere rappresentati come parte di una query SQL. In realtà, la forma di canonicalizzazione di SQL è query parametrizzate. Inoltre, è necessario eseguire dei passaggi per convertire la codifica del testo in un singolo tipo noto, in modo che vengano memorizzati solo i punti di codice validi. Se ciò non viene fatto, un punto di codice può essere interpretato erroneamente come un altro carattere.

Un esempio simile può essere dato per l'output in HTML. Se il database contiene <script>alert('xss!');</script> , un'app naive potrebbe semplicemente scriverla direttamente nella pagina e introdurre un problema di sicurezza. Tuttavia, con una corretta canonizzazione sotto forma di codifica dell'output, otterremmo &lt;script&gt;alert('xss!');&lt;/script&gt; , che un browser non può interpretare in modo errato.

La doppia codifica è un trucco usato per ingannare certi parser. L'autore dell'attacco identifica la codifica che stai utilizzando, quindi esegue la pre-codifica dei dati in questo formato. Il parser assume erroneamente che i dati siano canon e li gestisce come tali. Il risultato è che i dati sono maltrattati, così che si verifica un exploit. È un attacco di offuscamento, perché l'utente malintenzionato sta offuscando i dati di exploit, in modo che l'encoder non veda caratteri non validi.

    
risposta data 09.08.2012 - 10:33
fonte
5
  • Che cos'è la "codifica dell'output" e qualcuno può fornire un esempio concreto di come una routine di validazione potrebbe farne uso?

Codifica dell'output significa che i dati sono codificati in modo appropriato per il contesto in cui viene inserito. Ad esempio, supponi di voler visualizzare dinamicamente un nome da una fonte non attendibile: Your name is:<b>Foo bar</b> Se il nome contiene caratteri html, vuoi che vengano codificati, quindi il risultato è <b>Foo &lt;i&gt Bar</b> anziché <b>Foo <i> Bar</b> .

Quindi, convertire < in &lt; è un esempio di codifica html. Tuttavia, se il contesto è un attributo html, potrebbe essere necessario codificare anche caratteri-spazio, poiché un attributo può essere non quotato e uno spazio può quindi interrompere l'attributo e l'input può creare un nuovo attributo: <input value=data> viene attaccato con: <input value=data onclick=javascript:alert(1)/>

  • Che cos'è la "doppia codifica" e perché è un "attacco di offuscamento"?

Quando digiti determinati caratteri in un URL, questi diventano codificati per URL (di solito, anche se non in IE sempre):

  1. Parametro non codificato: test<script>alert(1)</script>
  2. Parametro con codifica URL: test%3Cscript%3Ealert%281%29%3C%2fscript%3E
  3. Parametro con doppia codifica: test%253Cscript%253Ealert%25281%2529%253C%252fscript%253E

A seconda della gestione dei parametri di input, la doppia codifica può passare attraverso alcuni filtri / validatori e terminare il contesto in cui vengono echeggiati (portando così a XSS).

  • Che cos'è la "canonicalizzazione" e perché impedisce la doppia codifica?

Canonicalizzazione è l'atto di scrivere qualcosa nella forma più semplice, quindi la forma canonica di qualcosa è la forma "più semplice" per scriverlo. Per canonicalizzare in questo contesto, significa non codificare i dati finché non cambia più.

Un triplo codificato < -sign, passa attraverso le seguenti trasformazioni:

  1. %25253C
  2. %253C
  3. %3C
  4. <

Un altro esempio può essere se l'input è scritto come ad esempio fughe ottali, lunghe sequenze UTF e codifiche esoteriche, come UTF-7. La canonicalizzazione li converte in una base comune, a scopo di disambiguazione.

    
risposta data 09.08.2012 - 10:44
fonte

Leggi altre domande sui tag