Ho trovato un bug che ti consente di sfuggire alla sandbox del modello AngularJS. Angolare è un linguaggio modello basato sui baffi. Ti permette di inserire espressioni che vengono valutate nel tuo html. Ad esempio, il rendering {{1 + 1}} viene eseguito in 2
La sandbox fa in modo che gli utenti non possano accedere a finestre / costruttori dall'interno di Angular all'interno delle espressioni. Ad esempio, non puoi fare {{{} .constructor = ...}}. Questo perché tali operazioni sono considerate non sicure nel caso in cui il sito stia salvando i modelli dall'input dell'utente. Apre il sito a XSS.
Passando attraverso il codice sorgente, ho scoperto che esiste un controllo per obj === {}. costruttore che può essere ignorato.
Fondamentalmente, si tratta di ignorare questo:
if (obj) {
if (obj === (0).constructor || obj === (false).constructor || obj === ''.constructor ||
obj === {}.constructor || obj === [].constructor || obj === Function.constructor) {
throw $parseMinErr('isecaf',
'Assigning to a constructor is disallowed! Expression: {0}', fullExpression);
}
}
Sono riuscito a superare quei controlli nascondendo le mie chiamate al costruttore all'interno di un altro oggetto (letterale dell'oggetto o letterale di array).
Oggetto letterale:
{{x = {'y':''.constructor.prototype}; x['y'].charAt=[].join;$eval('x=alert('Evaluated Object Literal')');}}
O come array:
{{x = [''.constructor.prototype]; x[0].charAt=[].join; $eval('x=alert('Evaluated Array')');}}
In che modo è possibile migliorare i controlli sopra riportati per far sì che questi casi non vadano a buon fine?
Ho provato a cambiare obj === {} .Controlla i controlli su instanceof invece che fa funzionare gli assegni, ma penso che possa introdurre i propri problemi di sicurezza. Vorrei inoltrare una richiesta di estrazione, ma spero che altri ricercatori di sicurezza là fuori possano contribuire alla conversazione per rendere la sandbox più strong possibile.
Ecco il mio problema pubblicato sul progetto Angular per riferimento: link
Ecco il materiale correlato: link
Ecco un jsFiddle: link